Newsgroup: it.comp.lang.delphi
Titolo: Segnalazione di eventi prima che waitforsingleobject se ne accorga

Ho una classe che fa queste operazioni in sequenza:
1) Costruisce un thread e gli passa dei valori
2) Fa partire il thread col resume
3) Subito dopo fa un waitforsingleobject aspettando che il thread alza 
un evento.
lato thread, esso fa questa operazione:
1) apre un canale di comunicazione con un oggetto
2) aspetta dei dati da questo oggetto
3) quando i dati sono arrivati, mediante setevent aggiunge l'evento che 
dovrebbe essere trappato dal programma chiamante
Il problema semplicemente e' che il thread, una volta partito, solleva 
subito l'evento e dalla parte del chiamante non riesco a trappare 
l'evento perchï¿œ ï¿œ giï¿œ accaduto.
Quello che non capisco e' perchï¿œ succede: come fa il chiamante, tra la 
resume e la wait a perdersi l'evento alzato dal thread? Posso risolvere 
mediante variabili condivise, ma non mi spiego come mai il signalling ï¿œ 
cosï¿œ veloce tra due istruzioni.
Miothread.Resume;
WaitForSingleObject(..); // resta bloccato in attesa di un evento giï¿œ 
lanciato...
-- 
Morde

 lanciato...
Troppe poche info per capire il problema.
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 l'evento perch� � gi� accaduto.
A che pro usare un thread se poi l'elaborazione � sincrona?
Mai porsi in condizioni potenziali di deadlock. Delega al thread
l'operazione ed aspetta che ti segnali il risultato mediante messaggio
(quelli di Windows vanno benone). Semmai nel thread principale attendi,
con un time-out abbastanza largo, che il messaggio ti arrivi. In ogni caso
� possibilissimo che tra la Resume e la WaitForSingleObject l'oggetto di
sincronizzazione entri in stato segnalato e quindi WFSO se lo "perda".
Nota che sotto Windows gli eventi possono tornare automaticamente in stato
non segnalato (quindi sbloccando una WaitForSingleObject alla volta)
oppure restare in stato segnalato (vedi documentazione del TEvent).


 oppure restare in stato segnalato (vedi documentazione del TEvent).
Grazie per i consigli, mi danno conferma dei miei sospetti sulla 
weakness della mia implementazione soluzione.
Ciao
-- 
Morde

oppure restare in stato segnalato (vedi documentazione del TEvent).
Grazie dei consigli, mi danno conferma dei miei sospetti sulla weakness 
della mia implementazione.
Ciao
--
Morde
-- 
Morde

 Troppe poche info per capire il problema.
Grazie ugualmente :) avevo giï¿œ capito che dovevo cambiare paradigma, di 
fatto resto comunque bloccato in attesa del messaggio o di un mio 
timeout, pertanto elimino il WFSO sostituendolo con un while su una 
proprietï¿œ esposta dal thread in AND con un timer impostato sul timeout.
Ciao
-- 
Morde

 timeout, 
No no, aspetta. Devi restare in attesa di un messaggio senza consumare
risorse (tipicamente sotto Windows lo fai con GetMessage/PeekMessage)
oppure gestire il tutto in maniera asincrona (che a mio modo di vedere �
molto meglio). In ogni caso io dubito che tu abbia bisogno di un thread
secondario. A che ti serve creare un thread se l'elaborazione poi non
procede in maniera parallela ma il thread principale resta in attesa
sincrona di una risposta?


 sincrona di una risposta?
Azz.. ho omesso un dettaglio a dir poco fondamentale #-) ... il thread 
istanzia un COM di una terza parte e ne invoca un metodo che ritorna 
una stringa, solo che quel metodo, nel ritornare la stringa, puï¿œ 
metterci un tempo che va da quasi zero a parecchie decine di secondi!
E' stato deciso di considerare come TIMEOUT la mancata risposta del 
componente dopo 2 secondi, e trattarla come tale dal programma.
Per questo motivo ho bisogno di un thread: per poter lanciare in 
esecuzione il com e distruggerlo nel caso in cui non abbia ancora 
risposto dopo il tempo considerato come TIMEOUT.
Ciao
-- 
Morde

 componente dopo 2 secondi, e trattarla come tale dal programma.
Hmmmmm ... capisco. Okay, allora costruisci un thread che faccia
quest'operazione e fagli mandare un custom message al thread/finestra
principale dell'applicazione non appena ha terminato. Il thread principale
pu� attendere quel messaggio per due secondi e quindi procedere a seconda
dei casi.


 dei casi.
Ora siamo perfettamente allineati.
grazie
ciao
-- 
Morde