TClientSocket qui ne bloque pas mon application

Signaler
Messages postés
302
Date d'inscription
vendredi 21 septembre 2007
Statut
Membre
Dernière intervention
6 février 2013
-
Messages postés
302
Date d'inscription
vendredi 21 septembre 2007
Statut
Membre
Dernière intervention
6 février 2013
-
Bonjour à tous !

J'ai une petite application qui contient, entre autre un TClientSocket, et je souhaite me connecter à plusieurs TServerSocket l'un après l'autre. Cependant, lors de la connexion au serversocket mon application se "bloque", il n'est pas possible à l'utilisateur de faire quoi que ce soit pendant 2/3 secondes. Je voudrais que les connexions/déconnexions se fassent "en arrière plan", que ce soit invisible pour l'utilisateur.

J'ai donc essayé un application.processmessages dans le OnConnecting de mon ClientSocket mais ça ne fonctionne pas mieux, j'ai également essayé en utilisant les Thread en suivant cet exemple : http://edn.embarcadero.com/article/26693 mais appliqué à mon cas, et toujours pas le résultat escompté...

Si toutefois vous auriez une idée, je suis preneur !

Merci d'avance !

3 réponses

Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
15
Bonjour,

C'est pourtant bien un Thread qui est LA solution.
Mais il est probable que l'exemple d'Embarcadero ne concerne pas ta version de Delphi.
Il doit en exister bien d'autres sur Google...
Messages postés
302
Date d'inscription
vendredi 21 septembre 2007
Statut
Membre
Dernière intervention
6 février 2013
1
Salut Cari !

Merci pour ta réponse, j'ai donc essayé avec d'autres exemples d'utilisation des Thread glanés sur google mais mon problème reste le même. Voici la partie de mon code concernée :

//déclaration du Thread
type
TSockThread = class(TThread)
private
FClientSocket: TClientSocket;
FUName: string;
procedure CltRead(Sender: TObject; Socket: TCustomWinSocket);
procedure cltErr(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
protected
procedure Execute; override;
procedure ThreadDone;
public
constructor Create; overload;
end;


constructor TSockThread.Create;
begin
inherited Create(True); // Intially suspended
FreeOnTerminate := True;
FClientSocket := TClientSocket.Create(nil);
FClientSocket.OnRead:=CltRead;
FClientSocket.OnError:=CltErr;
FClientSocket.Port := 322; // HTTP port
FClientSocket.ClientType := ctNonBlocking; // Blocking, so it is in a thread
end;

procedure TSockThread.Execute;
begin
if FClientSocket.Socket.Connected then FClientSocket.Socket.Close;
FClientSocket.Active:=false;
FClientSocket.Host := NomHost;
FUname:='';
FClientSocket.Active := True;
FClientSocket.Open;
end;

procedure TSockThread.cltRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
FUname:=socket.ReceiveText;
Synchronize(ThreadDone);
end;

procedure TSockThread.cltErr(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Synchronize(ThreadDone);
end;

procedure TSockThread.ThreadDone;
begin
FClientSocket.Active:=false;
frmPrincipale.ProcessData(FUname);
end;

procedure TfrmPrincipale.ProcessData(_Uname: string);
begin
Traitement(_Uname);
NextUnameVerif;
end;

procedure Tfrmprincipale.NextUnameVerif;
begin
GetNextHostName;
with TSockThread.Create do
Resume;

end;

Bonne aprem' !
Messages postés
302
Date d'inscription
vendredi 21 septembre 2007
Statut
Membre
Dernière intervention
6 février 2013
1
J'ai peut être trouvé une piste, sur ce lien, la personne dit qu'elle a un problème avec l'evenement OnRead, et une autre lui répond qu'on ne peut pas l'appeller en mode Blocking (ou via un thread ?), en tous cas, la fonction GetSocketData ressemble à ce que je voudrais faire, mais ce qui m'interresse n'est pas developpé, à savoir le result:=BlockAlloc(...); je ne sais pas trop comment l'intégrer à mon code... Si vous avez des idées...