Komunikacja pomiędzy programami

Komunikacja pomiędzy programami
0

Witam,

Muszę napisać 3 programy, które będą wymieniały dane pomiędzy sobą. Wiem że jest dużo możliwości, ale w związku z tym, że nie mam doświadczenia w tym temacie, chciałbym zapytać, jak w jaki najprostrzy i najpraktyczniejszy sposób komunikować się pomiędzy aplikacjami. Co polecacie?

Z góry dzięki.

XI
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 4 lata
  • Postów:245
0

Nie ma jednoznacznej odpowiedzi, każdy lubi co innego.
Wybór konkretnej technologii i tak powinien się opierać na jakichś przesłankach technicznych, co chcesz przesyłać i jaka jest architektura tego systemu?

0

Chcę wysyłać komunikaty do WindowsGame z WindowsForm, myślałem o stworzeniu połączonych wirtualnych portów szeregowych, ale to nie ma sensu ;)

K3
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:43
0

Wszystko zależy od zastosowania, musisz nieco sprecyzować problem. Do tego pytania pasują wszystkie rozwiązania począwszy od przerzucania danych protokołem UDP, poprzez wszelkiej maści WebService'y, do synchronizacji raz na dobę poprzez skopiowanie plików między komputerami :) Robisz grę, komunikator, aplikację bazodanową, czy coś jeszcze innego? Wymiana danych w ramach jednego komputera, w ramach jakiegoś LANu, czy z udziałem jakiegoś centralnego serwera dostępnego w internecie?

0

Aplikacje będą pracowały na jednym komputerze. Chodzi mi o to, że w windows form będę zadawał jakieś parametry, będą wykonywane obliczenia, zostaną one wysłane do 2 innych programów w których zostaną wyrysowane przez XNA.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Wrocław
0

To może memory mapped files? Raczej trudno o szybsze rozwiązanie w przypadku jednej maszyny.

0

Messaging, np. MSMQ

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Wrocław
0
gdfgddg napisał(a):

Messaging, np. MSMQ

I weź to potem debuguj.

Dzonzi
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 4 lata
  • Postów:132
0

A nie lepiej po prostu odczytywać prosto z pamięci pierwszego programu ? jak podajesz dane w pierwszym programie to on jest zapisuje do konkretnych zmiennych i pod danym adresem w ramie te dane są przechowywane, a wtedy na 2 i 3 programie odczytujesz wartości z tych adresów :P

somekind
Jak chcesz to osiągnąć w aplikacji, w której GC może w każdej chwili przesunąć wszystkie zmienne pod inne adresy?
Dzonzi
Nie ma takiego przesuwania adresów
somekind
@Dzonzi, dobrą praktyką jest nie odzywanie się w kwestiach, na których się nie zna.
0

Ok, a jak przekazać adresy zmiennych z programu do programu?? Dodam że 2 aplikacje renderujące odpalam przez System.Diagnostics.Process.Start(@"WindowsGame1.exe");

Nie było pytania ;) Dzięki, już wszystko działa ;)

Dzonzi
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 4 lata
  • Postów:132
0

Widzisz ? Jestem nowy na forum, a już pomogłem lepiej niż większość specuf z forum :D

somekind
Nikomu nie pomogłeś.
XI
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 4 lata
  • Postów:245
0

@Dzonzi to Twoje rozwiązanie to takie trochę hackowanie swojej własnej aplikacji. Jest mnóstwo technologii, które pozwalają na osiągnięcie celu jaki postawił sobie autor wątku bez takich spartańskich metod :)

somekind
Ja bardzo chciałbym zobaczyć w praktyce to hackowanie CLR i GC. :)
Dzonzi
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 4 lata
  • Postów:132
0

Każde rozwiązanie jest dobre jeżeli działa. A co jeżeli nie mamy wglądu do drugiego programu ? np. chcemy żeby nasz własny program odczytywał wartości temperatur z OCCT. Jak to wtedy można zrobić ? Chyba odczytywanie prosto z pamięci jest jedynym wyjściem

0
Dzonzi napisał(a):

Każde rozwiązanie jest dobre jeżeli działa.

Przemyśl jeszcze raz to, co napisałeś, bo to dyskwalifikuje dalszą dyskusję.

Dzonzi
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 4 lata
  • Postów:132
0

Lepiej proste rozwiązanie, które działa niż najbardziej skomplikowane, zaawansowane i szybkie, ale nie działające.

XI
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 4 lata
  • Postów:245
0
Dzonzi napisał(a):

Lepiej proste rozwiązanie, które działa niż najbardziej skomplikowane, zaawansowane i szybkie, ale nie działające.

Podsumujmy ;)
Czyli jeśli posiadam klasę Trójkąt w swoim programie i coś z nią robię, a nagle zmieniają się założenia i potrzebuje również klasę Kwadrat to najprostszym rozwiązaniem będzie skopiowanie klasy Trójkąt zmiana jej nazwy i przepisanie metod tak, że działały prawidłowo, jeśli jakieś metody będą miały takie samo działanie to zostawiamy w obu miejscach ten sam kod, a nóż się kiedyś przyda.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Wrocław
1
Dzonzi napisał(a):

Lepiej proste rozwiązanie, które działa niż najbardziej skomplikowane, zaawansowane i szybkie, ale nie działające.

Najprostszym i najszybszym rozwiązaniem są memory mapped files. Łatwe i wydajne są również named pipes. Proste, ale znacznie wolniejsze są zwykłe pliki. Nieco bardziej zaawansowane są kolejki albo bazy danych, za to pozwalają na komunikację między wieloma maszynami, czyli są tutaj niepotrzebne.

Czytanie z zarządzanej przez CLR i ciągle zmienianej przez GC pamięci jest najtrudniejszym ze wszystkich zaproponowanych rozwiązań. Na dodatek nie ma szans działać, bo jest raczej niewykonalne. Jeśli się mylę, to chętnie zobaczę jakiś dowód w postaci kodu - proszę o to już TRZECI raz.

0

Ja też jestem ciekawy tego rozwiązania - bo skoro można tak jak pisze Dzonzi, to po co opracowuje się technologie komunikacji między procesami.
W końcu przy uruchomieniu procesu, system przydziela dla niego pamięć i jest to pamięć chroniona (mechanizmy ochrony pamięci).

Co to tematu, ja w komunikacji kilku aplikacji na tym samym komputerze używam WCF i named pipes

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.