Hello
Voici mon soucis : j'ai un thread qui reçoit des données TCP (sjrd et Clorish !) dans un buffer (de type array of Bytes).
Ce buffer, je le passe depuis le thread principale. Seulement, j'ai des violation d'accès là-dedans ... !
Le principe que j'ai mis en place est le suivant : J'ai un tableau privé dans mon thread. Je renseigne cette variable par le biais d'une méthode public. Une fois renseignée, je dis au thread d'effectuer la lecture TCP, puis une fois fait, je traite le tableau dans mon thread principal (qui aura été modifié par mon thread).
Voici les deux solutions que j'ai essayé pour renseigné mon champ privée de mon thread de lecture :
1. Passage d'adresse par pointeur
2. Passage de variable par référence
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 type TBytes = array of Bytes; PTBytes = ^TBytes; //Dans mon thread principale procedure TWTQConnection.GetResponse(var AResponse: array of Byte); //AResponse est la tableau où je souhaite récupérer la réponse TCP var ReadBuffer: TBytes; //Utilisé pour passé au thread i: Integer; begin SetLength(ReadBuffer, TRAME_LENGTH); //Initialisation TCPThread.SetResponseTab(@ReadBuffer); //Renseignement du champ du thread TCPThread.DoRead; //Dis au thread de faire la lecture TCP repeat Sleep(10); Beep; //Fait quelque chose pendant que le thread est bloqué sur la lecture de la réponse until TCPThread.GetResponse; for i := D9_BYTE to D0_BYTE do AResponse[i-D9_BYTE] := ReadBuffer[i]; //Copie de la réponse dans le tableau reçu en paramètre : ACCESS VIOLATION ... !! end; //Dans mon thread procedure TTCPThread.Execute; begin while(not Self.Terminated) do begin if(ReadResponse) then begin TCPClient.ReceiveBuf(Response^, TRAME_LENGTH); //Lecture TCP ReadResponse := false; //Mise à jour de variable d'état HasResponse := true; end; Sleep(1); end; end; procedure TTCPThread.SetResponseTab(AResponse: PTBytes); begin Response := AResponse; //Renseignement du champ privé end; procedure TTCPThread.DoRead; begin ReadResponse := true; //Dis au thread de faire une lecture end; function TTCPThread.GetResponse; begin GetResponse := HasResponse; //Pour savoir si le thread à effectué sa lecture end;
(solution identique à la précédente, sauf qu'au lieu de travailler avec des pointeur, j'ai utilisé des TBytes comme type partout, avec des 'var' dans les procédures).
Dans la première solution, j'ai un Access Violation à la ligne en rouge. Dans la deuxième solution, j'ai un Access Violation lors que je renseigne mon champ privé pour la deuxième fois (pour la première fois, tout fonctionne).
J'espère avoir expliqué la chose suffisamment clairement pour ne pas vous dégouter !!
Merci d'avance pour votre aide et commentaires !
Partager