Bonjour à tous
Je cherche un exemple pour utiliser un composant ClientSocket en mode bloquant avec un thread "TClientSocketThread".
Je ne comprend pas a façon de créer le thread et la manière d'utiliser les bon arguments![]()
Merci d'avance
Mastok
Bonjour à tous
Je cherche un exemple pour utiliser un composant ClientSocket en mode bloquant avec un thread "TClientSocketThread".
Je ne comprend pas a façon de créer le thread et la manière d'utiliser les bon arguments![]()
Merci d'avance
Mastok
Salut,
le but des composants TClientSocket et TServerSocket, est que justement, tu n'as pas à gérer les threads, il le fait lui même.
Je te conseille ces trois discutions sur les composants socket :
Bonjour
L'utilisation de la classe TServerSocket en mode synchrone(bloquant) nécessite
une classe descendante de TServerClientThread
par ex:
tu implémente ton code dans le fichier .cpp de même nom
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class TMyServerThread : public TServerClientThread { public: // if true, FreeOnTerminate is set to false before the thread terminates, // and the thread is left in the thread cache. When KeepInCache is false, // the thread is freed when execution terminates. __fastcall TMyServerThread(bool CreateSuspended, TServerClientWinSocket* ASocket) : Scktcomp::TServerClientThread(CreateSuspended, ASocket) { CreateSuspended = false; FreeOnTerminate=false; }; void __fastcall ClientExecute(void); private: // tes membres privés };
tu crée une instance de ta classe de traitement dans la méthode OnGet Thread
ton composant TServerSocket créera ainsi pour chaque socket client une instance de ta classe TMyServerThread .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void __fastcall TForm1::ServerSocket1GetThread(TObject *Sender, TServerClientWinSocket *ClientSocket, TServerClientThread *&SocketThread) { SocketThread = new TMyServerThread(false, ClientSocket); }
Un point important le composant TServerSocket gère une cache des threads
il peut être nécessaire de contrôler par exemple dans le constructeur de ta classe si le nombre de threads crées est plus petit que la taille du cache (par défaut 10) de garder le thread en mémoire
cordialement
vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
je vous en souhaite une excellente lecture ...
A lire : Les règles du forum
Ok pour le serveur mais pour le Client j'aurais voulu créer un thread bloquant également.
tu Crée une classe descendant de TThread en passant dans le constructeur de cette classe le Port de connexion et un MemoryStream initialisé avec les données que tu veux transmettre au serveur
dans la méthode Execute de ta class Thread tu crée une instance de la classe TClientThread, tu initialise cette classe avec l'adresse du serveur, le mode de travail bloquant ,tu active l'instance de TclientThread, tu crée une boucle d'attente de type
dans l'aide de c++ Builder tu trouveras l'exemple suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 while (!Terminated && FSocket->Connected) { if(FStream->WaitForData(60000)) { //ton code de traitement } } // tu déconnecte le socket
cordialement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 void __fastcall TMyClientThread::Execute() { // crée un TWinSocketStream pour la lecture et l'écriture TWinSocketStream *pStream = new TWinSocketStream(ClientSocket1->Socket, 60000); try { // récupère et traite les commandes jusqu'à ce que la connexion ou le thread soit terminé while (!Terminated && ClientSocket1->Active) { try { char buffer[10]; GetNextRequest(buffer); // GetNextRequest doit être une méthode protégeant le thread // écrit la demande au serveur pStream->Write(buffer, strlen(buffer) + 1); // continue la communication (par exemple, lit une réponse du serveur) ... } catch (Exception &E) { if (!E.ClassNameIs("EAbort")) Synchronize(HandleThreadException()); // vous devez écrire HandleThreadException } } } __finally { delete pStream; } }
vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
je vous en souhaite une excellente lecture ...
A lire : Les règles du forum
Partager