Komunikacja między dwoma programami

Komunikacja między dwoma programami
  • Rejestracja: dni
  • Ostatnio: dni
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"

Kopiuj
   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"

Kopiuj
  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?

  • Rejestracja: dni
  • Ostatnio: dni
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ę.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
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

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 701
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.

Ktos
  • Rejestracja: dni
  • Ostatnio: dni
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.