Newsgroup: it.comp.programmare.win32
Titolo: comunicazione tra processi

Chiedo un consiglio a chi sviluppa su Windows usando VC++.
Vorrei sapere qual'e' il miglior modo per fare comunicazione tra
processi. Esiste qualcosa di simile alle code di messaggi di Unix?
Escludendo MFC!
Grazie,
Giovanni
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 processi. Esiste qualcosa di simile alle code di messaggi di Unix?
esistono anche su Win32 le code di messaggi, ma non sapendo come funzionano
su Unix non so dirti se ti siano altrettanto utili ...  in un messaggio
"semplice" puoi appiccicare 2 valori Interi 32bit da trasferire (che sono
wparam e lparam) ... esiste tuttavia un messaggio creato appositamente per
l'interscambio di informazioni: WM_COPYDATA. Ci sono antre tecniche IPC,
come le Pipe, Mailslot, Clipboard o i Memory Mapped File (usando il file di
paginazione come area condivisa)
Ciao
--
- Carlo -
c.b...@libero.it

 di Unix?
Windows dispone di molte piu` tecniche IPC rispetto a Unix. Non ne
esiste una "migliore", dipende dall'applicazione; diciamo che ne
esistono un paio da scartare a priori perche` sono obsolete, come DDE o
NetDDE.
In ogni caso, dato che un'applicazione Windows GUI si basa
sostanzialmente su una coda di messaggi e un ciclo che li elabora, si`,
direi che anche sotto a Windows le code di messaggi esistano. :)
Guarda ad esempio:
SendMessage()
PostMessage()
GetMessage()
PeekMessage()
E tutte le loro amiche.
--
Lorenzo

 Lorenzo
Da MSDN Library leggo che:
"...The SendMessage function sends the specified message to a window or
windows..."
Quindi, mi sembra di capire che sia utile per mandare messaggi
tra oggetti finestra. Io invece parlo di comunicazione tra semplici 
processi (threads per il mondo Windows).


 processi (threads per il mondo Windows).
Beh, PostMessage() ad esempio lascia il messaggio nella coda del thread che
ha creato quella finestra. Quindi sfrutti l'oggetto finestra ma in realtà il
messaggio lo lasci nella coda del Thread (per scoprire l'identificatore del
thread che ha creato una finestra di cui possiedi l'handle utilizza
GetWindowThreadProcessId()). Poi PostThreadMessage() ti permette di indicare
direttamente l'identificatore del thread a cui desideri postare il
messaggio.


 processi (threads per il mondo Windows).
Il fatto che le API che ti ha suggerito Lorenzo siano utili
per mandare messaggi tra finestre, non vuol dire che tu non
le possa utilizzare per far parlare tra loro i thread.
Le code dei messaggi sono associate ai thread, non alle finestre,
quindi quando mandi un messaggio, in realta' esso viene inserito
nella coda dei messaggi di un thread.  I thread, sotto Windows,
possono o meno avere una coda dei messaggi associata.  La coda
viene creata non appena chiami una delle funzioni che ti sono
state suggerite.  Tieni presente che dovrai implementare a mano
il ciclo di estrazione/elaborazione del messaggio.
Quello che puoi evitare e' di eseguire il "dispatch" dei messaggi
verso le finestre, visto che non hai intenzione di gestirle.


 
Come posso gestire questa comunicazione tra thread se questi sono di un
processo Windows privo di finestre?


 processo Windows privo di finestre?
Si possono creare strutture di sincronizzazione fra thread (semafori, mutex,
eventi, ...) e poi far si che uno thread aspetti (WaitForSingleObject()) la
segnalazione di un altro thread. Lo scambio dati può avvenire con variabili
o strutture dati globali, in quanto gli thread condividono lo stesso spazio
di indirizzamento.
Federico Molara.