Un serveur multithread

aroslide Messages postés 23 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 27 juin 2011 - 10 juil. 2007 à 13:02
aroslide Messages postés 23 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 27 juin 2011 - 18 mars 2008 à 23:01
Je suis en train de réaliser un serveur multithread sachant qu'un thread représente un client. quelqu'un aurait il une idée ou un algo pour pouvoir faire que les clients qui se connectent ne génent pas les autres clients déjà connectés au serveur. exemple tant que l'authentification n'est pas faite alors on suspend toutes les recherches mais on laisse les clients discuter sur le chat central ... etc....
j'ai un thread pour le serveur, un thead pour chacun des clients .... kelkun a une idée ? j'utilise Tsocket pour faire ça ...indy me pause trop de problèmes et est trop lent . 

2 réponses

aroslide Messages postés 23 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 27 juin 2011
22 juil. 2007 à 00:24
Bon alors je vais être un peu plus précis. j'utilise un thread tserver qui crée un thread tclient à chaques nouvelles connections par contre dans le server au moment de sa creation j'utilise un semaphore exemple : 

constructor tserver_thread.create(Port:Word;BindTo:string);
begin
freeonterminate:=true;
SemaphoreThreads := createSemaphore(nil,1,1,'');
semaphorelistwork :=createsemaphore(nil,1,1,'MYLISTWORK');

inherited create (false);
//apres c blablabla création du serveur on ouvre le port and co
end;

dans l'unité client au niveau de tclient.execute  je reprends le semaphore messagetosend. 

procedure TUser.Execute;
k,waitresult:integer;
begin 

// blablabla on reçoit une instruction de la part d'un client 
// on attend que le semaphore se libere pour executer une instruction ares l'autre
    k:=0;
           WaitResult := WaitForSingleObject(moteur.SemaphoreListWork, 0);


          while waitresult<>wait_object_0 do
           begin
           k:=k+1;


           end;
             hbwait_ms(k);   // là j'attends k milliseconds

end;

là c'est le crash il semble que le sémaphore semaphorelistwork n'attends pas d'avoir terminé une instruction pour en reprendre une autre .... personne à une idée ?
Au secours !!!!!!!!!
0
aroslide Messages postés 23 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 27 juin 2011
18 mars 2008 à 23:01
bon finalement la meilleur solution ça a été de faire un serveur asynchrone avec l'api winsock en programmation direct. vais bientot poster une source là dessus.


 


bye bye indy 10 nos amours sont finies.
0
Rejoignez-nous