View Full Version : [C/C++] rivolto a chi conosce il multithread e borland c++ builder
ho implementato due thread nel mio progetto e ho incluso anche il componente ServerSocket.
So che i due thread vengono eseguiti in parallelo, ma non è questo il mio problema ma un altro: ho settato nel componente ServerSocket l'evento OnClientRead in quanto desidero che il server risponda quando il client invia qualche messaggio al server e mi chiedevo: la risposta a tale evento assieme all'esecuzione dei due thread come viene vista al fine dell'esecuzione dell'intero processo?
Può esistere che i due thread e l'esecuzione del codice incluso nell'evento sia come eseguire tre thread oppure quando si esegue l'evento i due thread vengono messi in wait?
Sarebbe meglio scrivere un terzo thread per soddisfare i messaggi dei client oppure già così com'è fatto è performante?
Spero di essere stato chiaro anche se ho qualche dubbio.
starfred
31-10-2011, 14:49
Non c'ho capito molto :sofico: . Prova ad esser più chiaro oppure riporta il codice o preferibilmente pseudocodice :D
#include <......>
int tempo[255];
void __fastcall TForm1::Button1Click(TObject *Sender)
{
produttore = CreateThread(NULL,0,ThreadProduttore,NULL,0,&ID1);
scrittore = CreateThread(NULL,0,ThreadScrittore,NULL,0,&ID2);
}
DWORD WINAPI ThreadProduttore( LPVOID lpParameter)
{
for(int pp=0; pp < 255;pp++) tempo[pp]=xx;
}
DWORD WINAPI ThreadScrittore( LPVOID lpParameter )
{
for(int pp=0; pp < 255;pp++)
Label1->Caption = tempo[pp];
}
l'esempio è banale, il primo thread riempie ed il secondo visualizza. NOn ho usato semafori in quanto non è necessario ai fini del mio dubbio.
ora aggiungo il seguente evento
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int tmp;
String ClientRequest = Socket->ReceiveText();
if(ClientRequest.SubString(1,2) == "CA"){ /* carica un part-program sul CN */
tmp = ClientRequest.Length()-3;
CaricaPartProgram( ClientRequest.SubString(3, tmp ));
Memo1->Lines->Add("Carico programma");
}
Memo1->Lines->Add("Messaggio generico");
}
i due thread sopra esposti vengono eseguiti in base a come windows li schedula.
Come viene eseguito invece l'evento ServerSocket1ClientRead() ?
Viene trattato come se fosse un thread oppure, quando si passa ad eseguirlo gli altri due thread vongono messi in wait sono a quando l'evento è stato soddisfatto?
Quello che mi preoccupa è la perdita del parallelismo di due thread ad opera dell'evento.
ESSE-EFFE
02-11-2011, 11:09
produttore = CreateThread(NULL,0,ThreadProduttore,NULL,0,&ID1);
scrittore = CreateThread(NULL,0,ThreadScrittore,NULL,0,&ID2);
Perchè non usi la classe TThread inclusa nella VCL?
DWORD WINAPI ThreadScrittore( LPVOID lpParameter )
{
for(int pp=0; pp < 255;pp++)
Label1->Caption = tempo[pp];
}
Questo non puoi farlo. Non puoi accedere alla UI da un thread senza sincronizzare le cose.
Come viene eseguito invece l'evento ServerSocket1ClientRead() ?
Viene trattato come se fosse un thread oppure, quando si passa ad eseguirlo gli altri due thread vongono messi in wait sono a quando l'evento è stato soddisfatto?
I thread che crei girano in parallelo anche al thread che gestisce la UI (che non crei tu manualmente, ma c'è). Quindi il codice dell'evento non blocca i thread. Ti bastano poche righe di codice per verificarlo tu stesso.
Perchè non usi la classe TThread inclusa nella VCL?
Questo non puoi farlo. Non puoi accedere alla UI da un thread senza sincronizzare le cose.
I thread che crei girano in parallelo anche al thread che gestisce la UI (che non crei tu manualmente, ma c'è). Quindi il codice dell'evento non blocca i thread. Ti bastano poche righe di codice per verificarlo tu stesso.
due domande: cosa intendi per UI?
Per verificarlo da solo intendi che sarebbe sufficiente inserire qualche contatore nei due thread e nell'evento?
ciao
ESSE-EFFE
03-11-2011, 10:53
cosa intendi per UI?
User Interface. In questo caso forse era meglio parlare di GUI, però il senso penso si capisca.
Per verificarlo da solo intendi che sarebbe sufficiente inserire qualche contatore nei due thread e nell'evento?
Potrebbe essere un modo, sì.
grazie
quindi è come se avessi implementato tre thread di cui uno è gratis
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.