Komunikacja między aplikacjami

0

Witam.

Mam następujące pytanie.

W jaki sposób mogę skomunikować dwie osobne aplikacje?
Dokładniej to chodzi mi o stworzenie jakiegoś protokołu transmisji, np. przez porty, w ramach tego samego komputera (nie przez sieć). Obie te aplikacje tworzę samemu i chcę pomiędzy nimi przekazywać dane.

Zastosowałem metodę FindWindow() i SendMessage(), ale to jest zbyt wolne i obciążające. Próba znlezienia czegoś na forach nic mi nie dała.

Za pomoc z góry dzięki.

0

jak porty, to chyba raczej masz na mysli sockety a nie COM?:) po prostu piszesz tak jak sieciowo, ale uzywasz adresu docelowego 'localhost' albo 127.0.0.1

inne - pliki, komunikaty (sam widzisz), pipe'y, shared memory.. szukaj w google IPC (interprocess communication)

0

Opisz dokładniej co ma być przesyłane, kiedy, ile, w jaki sposób, jaka synhcronizacja. Mechanizmów komunikacji jest wiele, opisz dokładniej programy a będzie można dobrać odpowiedni.

0

Zamierzam przesyłać krótkie ciągi znaków będące wartościami liczbowymi i krótkimi komendami. Synchronizacja nie jest mi potrzebna. Ma to być taka główna aplikacja wyświetlająca dane z kilkunastu innych aplikacji, bez potrzeby "doglądania" każdej z osobna. Interesuje mnie coś najprostszego, aby nie było na wyrost.

Jeżeli możecie to podajcie jakieś linki, lub literaturę. Dzięki za zainteresowanie.

0

To moze pamiec wspoldzielona? To nawet by pasowalo - kazda z tych kilkunastu aplikacji umieszcza dane w obszarze pamieci o innej nazwie, z gory ustalonej. A aplikacja glowna wszystko to w petli odczytuje co jakis czas.
Proste rozwiazanie i bardzo szybkie.

0

To by mi pasowało. Nawet myślałem o czymś takim, tylko bałem się że sobie ze wskaźnikami nie poradzę. Możesz mi jakieś konkrety dać, bo w googlach nic na szybko nie znalazłem?

//to spróbuj na wolno... :[ - R

0

albo - NamedPipe's lub sockets... aplikacja-obserwator wystawia named pipe'a a obserwowani pisza na niego. latwiejsze w implementacji ale ma ten minus, ze jesli socket - to obserwator musi startowac pierwszy ( a w NP - klienci musza je stworzyc jesli nie istnieje bo obserwator odpalil sie po nich.. ale to tak jak named shmem..)

0

@sensi
Sory ale przestan sie blaznic, bo nic nie szukales - sam widzialem na CodeProject gotową klasę do obslugi named shmem - wszystko juz napisane tak, ze nawet w szczegoly implementacji wglebiac sie nie musisz, uzywasz na zasadzie WriteSharedMemory(nazwa,wartosc), ReadSharedMemory(nazwa, wartosc). Bardzo ładnie napisane przy użyciu Singletona i STL-a

Czyli wszystko czego ci potrzeba masz gotowe - adresu nie podam bo nie pamietam. Musisz poszukac "na wolno"

0
sensi napisał(a)

Zamierzam przesyłać krótkie ciągi znaków będące wartościami liczbowymi i krótkimi komendami.
W takim razie użyj komunikatów. Nie wiem dlaczego sądzisz, że są zbyt wolne, może wolny kod napisałeś. Komunikaty będą tu pasować jak ulał. W jednym komunikacie możesz przesłać jego identyfikator (komendę) oraz 8 bajów innych danych, np 2 liczby double.
Rozwiązanie jest proste jak but, nie wymaga synchronizacji ani międzyprocesowej ani z własnym IDE.

sensi napisał(a)

Zamierzam przesyłać krótkie ciągi znaków będące wartościami liczbowymi
Jeśli te ciągi będą znacznie dłuższe jak 8 bajtów to komunikat może informować o gotowości ich odebrania w strumieniu albo pamięci współdzielonej.

@sensi: nie wysiliłeś się za bardzo w opisie. Zresztą dlatego tyle różnych odpowiedzi dostałeś. Jakbyś lepiej sprecyzował to co chcesz napisać to dobrałoby się odpowiednie rozwiązanie. Na razie to możemy dywagować co będzie lepsze.

Na razie mogę powiedzieć, że sama pamięć współdzielona nie wystarczy jeśli mają być przesyłane komendy. Nada się do przesłania większej ilości danych.
Strumień nadałby się do obydwu zadań, jednak wymaga synchronizacji z IDE aplikacji i będzie trudniejszy do implementacji.
Pętla komunikatów nadaje się do przesyłania komend lepiej jak strumienie, ale nie prześlesz nimi wielu danych.

Jak dużo danych jest do przesłania ?
Czy w danym czasie dane wysyła tylko jeden proces, zanim nie zostaną odebrane ?
Wysyłanie danych jest jedno czy dwukierunkowe ?
Jak często wysyłane są dane a jak często komendy ?
Jakie IDE mają procesy ? Graficzne czy konsola ?
Ile jest procesów ? Zawsze 2 te same ?

0

Rozwiązanie jest proste jak but, nie wymaga synchronizacji ani międzyprocesowej ani z własnym IDE.

A shmem to wymaga? W tym przypadku raczej nie, co niby sie stanie skoro tylko jedna aplikacja odczytuje po kolei kolejne bloki shmem. A aplikacje "podrzedne" tez umieszczaja dane kazda w oddzielnym swoim bloku pamieci i nigdy nie bedzie zadnego konfliktu... wg mnie tutaj zadnej synchronizacji nie potrzeba,

Komunikaty moze i proste jak but, ale klopotliwe jednak i na pewno wolniejsze bo kilkanascie aplikacji bedzie przesylac na raz komunikat do jednego okna... zreszta nie ma nic szybszego od pamieci wspoldzielonej. Poza tym 8 bajtow to nie za wiele, a co jak trzeba bedzie przeslac dlugi ciag znakow? Znow kombinowanie

0
othello napisał(a)

tylko jedna aplikacja odczytuje po kolei kolejne bloki

othello napisał(a)

nigdy nie bedzie zadnego konfliktu

othello napisał(a)

zadnej synchronizacji nie potrzeba

othello napisał(a)

kilkanascie aplikacji bedzie przesylac na raz komunikat do jednego okna
@othello, ale skąd to wszystko wiesz, jak autor tego nie podał ? Jasnowidz ? ;)

othello napisał(a)

Poza tym 8 bajtow to nie za wiele, a co jak trzeba bedzie przeslac dlugi ciag znakow? Znow kombinowanie
Wtedy komunikaty+pamięć były by ok. Przesyłanie komend pamięcią współdzieloną byłoby bardzo kłopotliwe no i wymaga dodatkowej synchronizacji jakimś dodatkowym mechanizmem typu event (lub komunikat :) )

Użyłbym albo komunikaty+pamięć, albo strumienie, zależy jakie IDE i jak ma wyglądać ta komunikacja.

0
sensi napisał(a)

Ma to być taka główna aplikacja wyświetlająca dane z kilkunastu innych aplikacji, bez potrzeby "doglądania" każdej z osobna. Interesuje mnie coś najprostszego, aby nie było na wyrost.

Czyli: kazda aplikacja umieszcza sobie w pamieci wspoldzielonej jakies dane. Jak chce zmienic - umieszcza inne, ale ciagle w tym samym bloku pamieci...
Mowa tutaj nie o przesylaniu komunikatów, tylko o "wyswietlaniu danych z innych aplikacji", czyli pasuje mi tutaj wyswietlanie danych z pamieci wspoldzielonej...

A aplikacja "główna" przemiata to wszystko w pętli, co jakis czas odczytujac po kolei... po co tu synchronizacja? :> Wydaje mi sie ze to wystarczy do poprawnego dzialania, jezeli sie myle to prosze o poprawienie mnie

0
othello napisał(a)

A aplikacja "główna" przemiata to wszystko w pętli, co jakis czas odczytujac po kolei...
Co jaki czas ? Co ma robić pomiędzy odczytami ? To jest właśnie synchronizacja. Synchronizacja IDE programu z odczytem i pracą na danych. W przypadku komunikatów właściwie nie trzeba robić nic, żeby zsynchronizować IDE.

Za mało wiemy o samej aplikacji, żeby powiedzieć co jest dobre.

0
adf88 napisał(a)

Jakie IDE mają procesy ? Graficzne czy konsola ?

IDE? Masz na myśli interface użytkownika (UI) chyba? :>

0

Dobra, znalazłem to co chciałem. Dzięki za podpowiedzi :d

...prawie się pozabijaliście

0

oba sposoby są fajne...

Który wybrać? zależy od priorytetu tych wiadomości, jeśli to jakieś nie kluczowe informacje, które nie muszą być na bieżąco z punktu technicznego(o to chyba chodzi autorowi, bo wspominał tylko o wyświetlaniu informacji), to othello dobrze mówi, wystarczy sama pamięć którą sobie odczyta program, co czas najlepiej ustalony przez użytkownika(sekundę albo parę), dodatkowo bym jeszcze dorzucił informację o tym czy wpis był ostatni modyfikowany, np. pierwszy bajt będzie o tym informował, proces zapisujący ustawi go na 1, a przy odczycie na 0 i będzie wiadomo czy to aktualna informacja, bo nie ma sensu co każdy obieg odczytywać całości, oczywiście w przypadku dłuższych informacji, bo dla 10B się chyba nie opłaca tak kombinować no i dla informacji o różnych długościach kolejne bajt długość zawartej informacji, żeby było wiadomo ile odczytać :>

a jeżeli informacje będą kluczowe, bo adf dobrze mówi komunikaty na bieżąco, jak program jest w okienkach, to najlepiej zrobić odzileny wątek z pętlą tylko dla tych komunikatów, żeby nie zapychać ich razem z komunikatami z GUI

0
0x666 napisał(a)
adf88 napisał(a)

Jakie IDE mają procesy ? Graficzne czy konsola ?

IDE? Masz na myśli interface użytkownika (UI) chyba? :>
O w mordę, oczywiście, że UI :-D

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