TClientSocket qui ne bloque pas mon application

L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013 - 28 mars 2012 à 17:00
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013 - 30 mars 2012 à 17:09
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

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
29 mars 2012 à 01:29
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...
0
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
30 mars 2012 à 13:40
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' !
0
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
30 mars 2012 à 17:09
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...
0