Newsgroup: it.comp.programmare.win32
Titolo: Thread in C++

Qualcuno può darmi qualche dritta per implementare il multithread in una mia
applicazione?
Ciao e grazie a chi mi risponderà,
Maurizio.

,

I thread sono un concetto nel dominio del sistema operativo, non
del linguaggio, e possono essere implementati in qualunque
linguaggio che sappia crearli nel modo previsto dal tuo sistema
operativo (presumo Win32).
FAtta questa ovvia premessa, occorre dire che non tutte le applicazioni
traggono vantaggio dall'utilizzo di piu' thread.
In linea di principio, se una applicazione ha una interfaccia utente
complessa e deve svolgere operazioni complesse, allora questo e' uno
dei casi in cui piu' thread possono dare luogo ad una applicazione che
sembra all'utente piu' "rispondente".
Altra situazione: la tua applicazione e' vincolata da operazioni
di IO, tra cui accessi al disco ed accessi alla rete, allora anche in
questo caso l'utilizzo di piu' thread puo' giovare.
Nel caso delle applicazioni con interfaccia utente, tipicamente
il thread principale esegue il message loop.
Durante l'inizializzazione si crea uno o piu' worker thread, che
rimarranno in attesa di fare qualcosa (senza consumare la CPU).
Quando l'utente "ordina" di fare qualcosa, allora un conveniente
segnale (Evento, Mutex, Semaforo, pipe) dira' al thread di fare
il suo lavoro.
Se hai di mezzo componenti COM, allora la faccenda si complica.
Devi decidere il tuo thread di STA e come inizializzeranno COM gli
altri thread. Ricorda: in un processo con 2 thread e COM inizializzato
male puoi arrivare ad avere altri 5 thread senza accorgertene neppure.
Se hai operazini di IO da fare, le tecniche di progetto si moltiplicano.
Il capitolo dell'ovelapped IO e' ampio: puoi usare Overlapped IO
e poi aspettare il completamento della operazione, oppure creare
una Completion Port, creare un thread che fa da dispatcher sulla
completion port e che riutilizza un pool di thread per le richieste
man mano che il sottosistema di IO le completa.
Per quanto riguarda il linguaggio, il C++ ti complica la vita,
perche' richiede che la libreria standard sia inizializzata per
funzionare in modo multithread, dovresti usare _beginthreadex
al posto di CreateThread.
Sent via Deja.com 
http://www.deja.com/
Share what you know. Learn what you don't.

applicazione?
Che genere di ambiente di sviluppo/linguaggio utilizzi? Le API, MFC, ecc... ?
Bye! Lorenzo Lutti (
http://members.tripod.it/fidocad
)

 >Qualcuno puň darmi qualche dritta per implementare il multithread in una


>Maurizio.
I thread sono semplici da usare e tra l'altro sono molto efficienti.
MFC ha delle proprie classi per la gestione dei thread (CThread se non ricordo male).
Con le API e' sufficiente chiamare CreateThread passando tra le altre cose il puntatore di una funzione definita in modo particolare (vedi help) per eseguire contemporaneamente al resto del programma la funzione passata.
Se hai bisogno di sincronizzare i thread ci sono degli oggetti di sistema: mutex, semafori, etc.
Se hai bisogno di scambiare messaggi tra i thread devi fare un altro ciclo dei messaggi nel thread e usare PostThreadMessage per inviare i messaggi.
Antonio Donatiello

aiuto č bene accetto.
Beh, a parte le classi MFC che "avvolgono" i thread di cui ti ha parlato
l'altro utente (e che potrai approfondire in un secondo momento) c'e` un modo
immediato per usare i thread: chiamare AfxBeginThread() nella versione per
"worker threads". Innanzitutto devi definire una funzione membro *statica*
(occhio!) che costituira` il codice del thread:
UINT CMyWnd::ThreadFunc( LPVOID pParam) { ...
Poi e` sufficiente chiamare AfxBeginThread() specificando tale funzione come
argomento:
CWinThread *thread = AfxBeginThread( ThreadFunc, pParam);
A questo punto il nuovo thread iniziera` la sua esecuzione da ThreadFunc e
terminera` quando si uscira` da tale funzione (il valore di uscita del thread
sara` il valore di ritorno della funzione). pParam lo puoi usare per passare
dei parametri; dato che ThreadFunc e` statica, e` molto comune passare
(LPVOID)this per potere accedere alle funzioni e variabili della classe
"genitrice".
