Komunikacja między dwoma programami

0

Witam,
Mam "Program Matka" oraz "Program dziecko".

Schemat działania:

Matka uruchamia Dziecko
Dziecko na starcie wykonuję funkcję pierwszą
Jeśli skończy, to musi powiadomić o tym matkę. Ja wykorzystałem zapisywanie do pliku tekstu "GOTOWE".
Matka sprawdza plik i widzi, że jest tam napis, więc go usuwa i powtarza cały proces.

Jeśli matka już uruchomiła 5 DZIECI i każdy wykonał swoją funkcję 1, to teraz matka zapisuje w pliku tekst "START".
Dzieci po wykonaniu funkcji pierwszej sprawdzały, czy w pliku jest tekst "START". Jeśli jest, to wykonują funkcję drugą.
Po wykonaniu funkcji drugiej wszystkie dzieci są zamykane (procesy).

MATKA - Sprawdzanie czy w pliku jest tekst "GOTOWE"

   While True
                    czyJest = File.ReadAllText("C:\Users\Administrator\Desktop\BOT DZIECKO\plik.txt")
                    If (czyJest.Contains("GOTOWE")) Then
                        licznik += 1
                        File.WriteAllText("C:\Users\Administrator\Desktop\BOT DZIECKO\plik.txt", "")
                        Exit While
                    Else
                        Threading.Thread.Sleep(10000)
                    End If

                End While

DZIECKO - Sprawdzanie czy w pliku jest tekst "START"

  While True

                linia = File.ReadAllText("C:\Users\Administrator\Desktop\BOT DZIECKO\start.txt")

                If (linia.Contains("start")) Then
                    Exit While
                Else
                    Threading.Thread.Sleep(20000)
                End If
            End While

Taki program działał mi 10 godzin, jednak wczoraj z jakiegoś powodu po wykonaniu funkcji pierwszej pierwszego dziecka program MATKA tego nie zauważył. Być może w tym samym momencie dziecko zapisywało treść do pliku, kiedy MATKA go odczytywała. Nie było żadnego błędu (nie ma też try catch). W pliku też nie było tekstu "GOTOWE" mimo, iż funkcja pierwsza została wykonana.

Powinienem chyba wybrać inną metodę komunikacji między programami. Co możecie mi polecić? Myślałem nad skorzystaniu z czegoś takiego, że MATKA będzie uruchamiała kolejne dziecko w momencie, kiedy plik został zmodyfikowany. Zdaje się, że jest taka funkcja. Są jakieś lepsze pomysły?

0

Wykorzystaj jakąś inną metodę komunikacji międzyprocesowej (sockety, pipey, shared memory). Pliki dyskowe nie wydają mi się dobrym pomysłem.

A sprawdzanie czy coś jest w pliku (socket i pipe też się w to wlicza) najlepiej robić nie przez czekanie, ale przez wywołania biblioteki poll lub select. Są to standardowe funkcje unixowe.
Nie wiem jak będzie na windowsie, niech ktoś kto ma wiedzę wypowie się.

0

pliki to chyba najgorsze rozwiązanie (chociaż może się wydawać najprostsze). Tu https://www.google.pl/search?q=vb+net+ipc do poczytania o IPC w VB .NET. Jak wspomniał poprzednik sposobów jest kilka

0

Mozesz uzyc tez po prostu socketow i oprzec to na komunikacji Serwer (matka) - Klient (dziecko).
Wtedy unikniesz problemow z modyfikowaniem pliku i jakims przeoczeniem zmian.

1

Ostatnio zaimplementowałem prostą komunikację między dwoma instancjami programu poprzez potoki nazwane (named pipes) do przekazywania jednobajtowych wiadomości i nie jest to specjalnie skomplikowane - kod co prawda w C#, ale dość prosty: https://github.com/ktos/fa287a/blob/master/Fa287a/Ipc.cs

1 użytkowników online, w tym zalogowanych: 0, gości: 1