
Envoyé par
edam
he Mac LAK c'est logique ces deux boucle imbriqué????

Oui, parcequ'il y en a une pour la répétition du thread et une pour la boucle de message. Non, parceque la boucle de message ne traite pas le cas Terminated.
Je propose plutôt :
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
| Procedure TCustomClientThread.Execute;
var
Msg : TMsg ;
begin
While (Not Terminated) Do
Begin
MsgWaitForMultipleObjects(0,NULL,FALSE,500,QS_ALLINPUT);
While (Not Terminated) And (PeekMessage(Msg,HWND(-1),0,0,PM_REMOVE)) Do
If Msg.message = CLIENT_THREAD Then
Case Msg.wParam of
CONNECTION : PrConnection;
DECONNECTION : PrDeconnection;
RECEPTION : PrReceiveBuf;
ENVOIE : Begin
fBuf:=AllocMem(Length(PChar(Msg.lParam))+1);
StrCopy(fBuf,PChar(Msg.lParam));
PrSendBuf;
End;
End;
Else Begin
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
End;
End; |
Le test de Terminated est à faire avec un While, plutôt : ainsi, on évite des effets de bords "amusants", comme tenter de terminer le thread par un appel à Terminate sans jamais avoir envoyé de message auparavant => le thread se bloque... De manière générale, le test de cet attribut doit être dans toutes les conditions de boucles du thread.
sioux : Tu devrais soigner un peu l'indentation de ton code, c'était pénible à lire. J'ai corrigé l'indentation, d'une part, et le type de Msg d'autre part.
Note : L'appel à WaitMessage est à éliminer si l'on veut pouvoir faire un traitement périodique sur le thread, car elle est bloquante (même si elle ne consomme pas de temps CPU). Il faut alors implémenter un message de type WAKE_UP pour "réveiller" le thread si l'on veut pouvoir effectuer un tel traitement.
J'aurais quand même tendance à privilégier la fonction MsgWaitForMultipleObjects à la place, qui permet d'implémenter un timeout. Dans ton cas précis, la valeur de retour n'a aucune importance.
Elle s'utilise ainsi :
MsgWaitForMultipleObjects(0,NULL,FALSE,500,QS_ALLINPUT);
A mettre en lieu et place de l'appel à WaitMessage. Dans l'exemple ci-dessus, le timeout est de 500 ms.
Partager