Newsgroup: it.comp.programmare.win32
Titolo: Eventi su handle

Ciao a tutti,
sto realizzando un'applicazione in C sotto NT e devo aspettare degli
eventi su handle di dipo diverso (pipe, console, ecc.), c'è nessuno che
ha mai dovuto fare qualcosa di questo tipo e mi può consigliare una
strategia?
In sostanza il thread dell'applicazione si deve fermare fintanto che non
arriva qualcosa sul buffer di questi handle diversi.
(BTW non mi sembra che l'API "WaitForMultipleObjects" sia adatta)
Grazie
Raffaele.

 (BTW non mi sembra che l'API "WaitForMultipleObjects" sia adatta)
Perche` no? WaitForMultipleObjects() verifica lo stato (signaled o meno) di
tutti gli handle, a prescindere da quale funzioni li ha creati.
Io ho "aspettato" oggetti diversi in piu` di un'occasione, sempre senza
problemi. Ad esempio quando nell'applicazione si mette un thread che gestisce i
cambiamenti del filesystem (con FindFirstChangeNotification() e amici) e` buona
creanza fare aspettare assieme a questo handle anche l'handle di un oggetto
evento, in modo da poter "risvegliare" il thread per farlo terminare quando si
esce dall'applicazione.
--
Bye! Lorenzo Lutti (
http://www.geocities.com/SiliconValley/Peaks/6258/
)

 (BTW non mi sembra che l'API "WaitForMultipleObjects" sia adatta)
Perche` no?  Comunque, personalmente e in generale, io tendo a
utilizzare la MsgWaitForMultipleObjects -- questa, oltre che quando
uno degli oggetti e` pronto, esce quando arriva un messaggio a una
window di questo thread o al thread stesso (si puo`, se occorre, essere
un poco + selettivi), nel qual caso si puo` porre un semplice ciclo di
chiamate a PeekMessage/DispatchMessage (ecc ecc) per servire i
messaggi in coda prima di tornare in attesa.  Servire i propri messaggi
e` buona prassi... anche se pensi di non avere finestre cui questo si
potrebbe applicare, non e` detto che sia cosi` (ad esempio, l'SCM di
COM potrebbe avere generato una finestra top-level invisibile per la
serializzazione dell'accesso a un oggetto single-threaded), e chi non
serve i messaggi puo` bloccare altre applicazioni (ad esempio, il DDE
si blocca, a causa di un SendMessage con HWND_BROADCAST che le
librerie del DDE eseguono, se qualche finestra top-level non serve i
messaggi...).  Naturalmente, questo e` rilevante solo per attese che
possono protrarsi significativamente (piu` di qualche millisecondo,
diciamo) -- se "sai" che l'attesa sara` molto breve (ma l'unico modo
*certo* di saperlo e` avere un timeout, appunto breve, sulla call
dell'API di attesa stessa!-), la cosa non e` tanto importante.
Alex

Scusatemi,
mi ero dimenticato di dire che gli oggetti su cui devo "aspettare" non sono
solo degli handle, ma anche dei socket. E' per questo che dicevo che l'API
"WaitForMultipleObjects" non mi sembrava adatta, perchè accetta solo degli
handle come oggetti su cui aspettare.
Non sapete se si possono "agganciare" gli oggetti di tipo socket e aspettare
anche su quelli? Forse c'è un modo che mi sfugge, magari con "CreateEvent" o
simili...
Se qualcuno mi sa dire qualcosa di utile a riguardo lo ringrazio molto.
Raffaele.
P.s.
Grazie ad Alex ed a Lorenzo* per aver risposto al post precedente.
(* ho provato lo screen saver di Tafazzi che sta sul tuo sito... fantastico
^__^)

 ^__^)
Mi ero dimenticato di averlo scritto. E dire che sono diventato matto a
estrarmi A MANO i frames dal filmato... :)


 usata ma leggendo la descrizione penso che possa andare.
Non mi sembra; gli "eventi" di cui parla la doc sono "eventi interni".
Personalmente, userei invece WSAAsyncSelect per avere la notifica
dell'attivita` su socket come messaggio Windows, e MsgWaitFor &c
cosi` da gestire i messaggi mentre si attendono i vari altri oggetti di
kernel -- nella gestione del messaggio impostato con WSAAsyncSelect,
se occorre, ci si puo` limitare a settare un oggetto di kernel "evento"
da porre fra quelli per cui aspetta la MsgWaitFor &c &c (ma in realta`
ci sono anche approcci piu` semplici, ad esempio lo stesso message
loop subito dopo la MsgWait&c potrebbe testare per la presenza di
quello specifico messaggio, ecc ecc).
Alex

 usata ma leggendo la descrizione penso che possa andare.
Esatto!! L'ho trovata anch'io dopo aver scritto il post ed ora, quando avrò un
attimo di tempo libero, proverò a  vedere se funziona. In realtà non sono
sicurissimo che vada bene perchè la guida dice che gli eventi in uscita da questa
funzione possono essere "aspettati" tramite
WSAWaitForMultipleEvents e non WaitForMultipleObjects, tuttavia si può supporre
che la prima sia un wrapper della seconda o viceversa quindi non dovrebbero
esserci grossi problemi. Comunque se la cosa funziona vi faccio sapere.
Grazie dell'interessamento
Raffaele.