Newsgroup: it.comp.programmare.win32
Titolo: [?] - AfxEndThread

Come si usa?
Da MSDN non ho capito un tubo.
Creo una classe ed eredito da CWinThread
CMyTh : public CWinThread
{
...
}
Negli attributi della classe view
CMyView : public CView
{
   ...
public:
    CMyTh *m_pTh;
}
Nella funzione della view richiamata dal Menu
StartThread()
{
    m_pTh = (CMyTh*)AfxBeginThread( RUNTIME_CLASS(CMyTh) );
}
Nella funzione
StopThread()
{
    cosa scrivere?
    AfxEndThread va sempre in Assertion Failed perchè in questo modo ( da
quello che ho capito ) va a terminare il Thread dell'applicazione.
}
grazie per favore è urgente!
JoGiò

 }
AfxEndThread termina il thread corrente....il thread che chiama la funzione
per intenderci.
La devi chiamare all'interno del thread che vuoi terminare.
Porlock

 ha scritto nel messaggio



Allora tu hai, se non ho capito male, la necessità di controllare dal thread
A il lancio e la terminazione del thread B.
AfxEndThread serve appunto per terminare il thread corrente, quindi il
thread A non la può usare per terminare il thread B.
Se hai questa necessità l'API TerminateThread è più idonea, ti permette di
terminare un thread dato il suo handle.
Gli avvertimenti della Microsoft a riguardo di questa API sono piuttosto
chiari e giustificati, andrebbe utilizzata come ultima risorsa per terminare
un thread.
Ti consiglio quindi di accedere a MSDN per ulteriori chiarimenti.
Il mio suggerimento è di utilizzare qualche meccanismo tramite il quale il
thread A segnala al thread B che deve terminare la propria esecuzione.
Nel thread B quindi dovresti implementare il meccanismo per la terminazione
del thread stesso(dalla semplice chiusura della finestra primcipale tramite
WM_CLOSE all'utilizzo di AfxEndThread).
Il meccanismo potrebbe essere un messaggio particolare mandato o al thread
(PostThreadMessage), o alla finestra principale (tramite PostMessage);
oppure potresti utilizzare una variabile globale con l'accesso controllato
da un MUTEX.
Sarebbe quindi il thread B che potrebbe controllare periodicamente lo stato
della variabile, o gestire il messaggio idoneo per poi iniziare la più
idonea procedura di chiusura.
Porlock

 terminare un thread dato il suo handle.
due parole: reace conditons.

Tutto chiaro
Alla chiamata di pTh = AfxBeginThread( RUNTIME_CLASS( ClassName ) );
il thread viene creato ed eseguito
cio significa che è in attesta di ricevere messaggi
E' vero?
ciao
JoGiò

 ha scritto nel messaggio
news:b0mh9l$8ip$1...@e3k.asi.ansaldo.it...

...dimenticavo
fino a quando non riceve il messaggio WM_QUIT.
Per AfxEndThread vale quello che ha detto Porlock
bye

 ha scritto nel messaggio
news:b0mh9l$8ip$1...@e3k.asi.ansaldo.it...

Sì direi di sì.
Però se non ti preoccupi di creare l'interfaccia utente nella InitInstance
credo (ma non sono sicuro) che il thread termini immediatamente.
Porlock


Non so cosa intendi per "l'interfaccia utente nella InitInstance"
Ho lasciato tutto invariato e il TaskManager mi riporta perfettamente il
numero di Thread che aprň
Quando il Thread sta in Run() entra in questione il discorso della
messagistica ( WM_TIMER, WM_PAINT etc.. )
che se vuoi intecettarli devi vare l'overloading della funzione
PreTranslateMessage...
Sono riuscito a creare anche un Timer all'interno del mio Thread, ora voglio
legarlo
al comando asincrono del Socket
Puoi spiegarmi cosa significa "l'interfaccia utente nella InitInstance"?
Grazie

 Grazie
Come ti dicevo il CWinThread viene consigliato di solito quando si vuole
lanciare un thread che gestisca un'interfaccia: finestre, controlli, timer,
tutta quella roba lě, proprio perché č implementato il discorso della
messaggistica (CWinThread::PumpMessage).
Il mio dubbio risaliva al fatto che nella classe CWinApp (che deriva da
CWinThread) non crei la finestra principale (nella CWinApp::InitInstance) e
non l'assegni al membro m_pMainWnd, la classe se ne accorge e lancia un
WM_QUIT terminando il thread.
Sono abbastanza certo di questo comportamento per la CWinApp, ho controllato
per CWinThread e questo meccanismo non č implementato.
Il mio era un dubbio, ciň che stai facendo č corretto.
Ciao
Porlock


Allora mi stai dicendo che se volessi creare un thread generico ( esempio
che ascolta da LAN su un socket )
devo implementare una funzioni con un ciclo for ever etcc...
uscendo fuori dall' Object Oriented!(i miei programmi hanno una struttura
tutta ad oggetti)
Come usare CWinThread per fare sta cosa?
Cioè, una volta che sta in Run come creare una funzione membro che ascolta
su LAN?
Grazie ancora per la disponibilità!
JoGiò

 JoGiò
Prego.
Spero di essere stato più chiaro.
Porlock