L_art_ment
Messages postés302Date d'inscriptionvendredi 21 septembre 2007StatutMembreDernière intervention 6 février 2013
-
28 mars 2012 à 17:00
L_art_ment
Messages postés302Date d'inscriptionvendredi 21 septembre 2007StatutMembreDerniè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 !
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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...
L_art_ment
Messages postés302Date d'inscriptionvendredi 21 septembre 2007StatutMembreDerniè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 :
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;
L_art_ment
Messages postés302Date d'inscriptionvendredi 21 septembre 2007StatutMembreDerniè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...