Bonjour à tous !
Je dev un projet qui utlise une dll. Cette dll me permet de me connecter à un serveur et de recuperer une trame.
J ai donc mis en place un thread pour executer l "ecoute" du serveur :
----------------------------------------------------------------------------------------------------------------------------------
unit Unit2;
interface
uses
Classes,Windows,Unit1 ;
type
MonThread = class(TThread)
private
FForm : TForm1;
{ Déclarations privées }
protected
procedure Execute; override;
procedure Traiter;
procedure Sync;
public
constructor Create(Form : TForm1);
end;
implementation
{ Function importées de la DLL}
function OpenSession(loggin : PChar; pswd : PChar): integer; StdCall; external 'Test.dll';
function Init(portServSPAD : integer ;portServTPAD : integer): integer; StdCall; external 'Test.dll';
function CloseSession(): integer; StdCall; external 'Test.dll';
function GetMessage(messages : PChar): integer; StdCall; external 'Test.dll';
{ MonThread }
var
trame : array[0..1024] of char;
LaTrame : string;
procedure MonThread.Traiter;
begin
FForm.Ed_Loggin.Text := 'Grrrrrrrr';
FForm.TraiterTrame(Trame);
end;
constructor MonThread.Create(Form: TForm1);
begin
inherited Create(False);
FForm := Form;
FreeOnTerminate := True;
end;
procedure MonThread.Sync();
begin
Synchronize(Traiter);
End;
procedure MonThread.Execute;
var
test : boolean;
ret : integer;
SPass,SLoggin : string;
begin
while not Terminated do
begin
sleep(1500);
ret := GetMessage(trame);
if ret <> 0 then
begin
// Gerer la reconnection
Init(3002,3001);
CloseSession();
Sleep(5);
SPass := 'EMULOP01';
SLoggin := 'EMULOP01';
OpenSession(PChar(SPass),PChar(SLoggin));
end
else
begin
LaTrame := String(trame);
if LaTrame <> '' then
}
Sync();
//Form1.TraiterTrame(String(Trame)); // Je triche en virant les // et en desactivant Sync(), ca marche mais ce n est
// pas 'securisé'
end;
end;
end;
end.
----------------------------------------------------------------------------------------------------------------------------------
Je lance mon app (une form avec un bouton pour lancer le thread, la procedure TForm1.TraiterTrame(Trame))
puis je click sur le bouton de lancement du thread :
MyThread:= MonThread.Create(Form1);
Le thread se lance, fait son travail et :
-Si ma souris est sur la form, le synchronize du thread se fait correctement !
-Si ma souris est hors de la form, le thread ne rentre pas ds la procedure à synchronize tant que je ne rentre pas ma souris sur la form. (si je met un point d arret à l entree de Traiter() il n est atteind que ds le cas ou ma souris reviens sur la form !!)
J ai ajouté le passage de la form a mon thread en pensant que le prob venait de la.... mais non :(
J ai essayer de virer tout le code 'superflu' de la methode execute en ne laissant que le synchronize, mais c est idem.
Si je supprime le Sync() et que je le remplace par : Form1.TraiterTrame(String(Trame));
cela marche correctement, mais n est pas 'Sécurisé' ??
Au secours !!!!!
Merci ;)