begin process at 2012 02 11 07:28:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Débutant(e)

 > 

problème multi-threading


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

problème multi-threading

dimanche 4 mars 2007 à 10:14:15 | problème multi-threading

OcHre

Bonjour, comme explicité dans le titre j'ai un problème de multi-threading à savoir que j'ai normalement 3 threads (VCL) qui doivent s'executer en meme temps sauf que ceux-ci s'executent les uns aprés les autres...
Mes trois threads sont construits de la meme façon:

[code]
type
Threadping = class(TThread)
  private
    procedure ping;
  public
    constructor Create(CreateSuspended:boolean);
  protected
    procedure Execute; override;
  end;

implementation

constructor Threadping.Create(CreateSuspended:boolean);
begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:=true;
  Priority:=tpNormal;
end;

procedure Threadping.ping;
var
part1,part2,part3,part4,count:integer;
begin
count:=0;
form1.memo2.lines.add('thread1');
part1:=posip(form1.edit1.Text,1);
part2:=posip(form1.edit1.Text,2);
part3:=posip(form1.edit1.Text,3);
part4:=posip(form1.edit1.Text,4)-2;
repeat
inc(count);
inc(count);
application.processmessages;
form1.Label13.Caption:=inttostr(count)+'/'+inttostr(nombrehost);
inc(part4);
inc(part4);
if part4>=254 then
begin
inc(part3);
part4:=1;
if part3>=254 then
begin
  part3:=1;
  inc(part2);
   if part2>=254 then
   begin
   part2:=1;
   inc(part1);
   end;
end;
end;
form1.label10.Caption:=inttostr(part1)+'.'+inttostr(part2)+'.'+inttostr(part3)+'.'+inttostr(part4)+'t1';
form1.clping.Host:=inttostr(part1)+'.'+inttostr(part2)+'.'+inttostr(part3)+'.'+inttostr(part4);
form1.clping.ReceiveTimeout:=strtoint(form1.edit4.text);
try
form1.clping.Ping;
if form1.clping.replystatus.BytesReceived>0 then
begin
form1.Memo1.Lines.Add(inttostr(part1)+'.'+inttostr(part2)+'.'+inttostr(part3)+'.'+inttostr(part4));
form1.edit5.Text:=inttostr(form1.Memo1.lines.count);
end;
except
end;
until count>=nombrehost;
end;

procedure Threadping.Execute;
begin
Sleep(500);
synchronize(ping);
end;

[/code]

Mes threads sont créés de cette facon:

[code]

procedure TForm1.Label6Click(Sender: TObject);
var
Thping:Threadping;
thping2:threadping2;
begin
thping:=threadping.Create(false);
thping2:=threadping2.Create(false);
end;

[/code]

Ce que je ne comprends pas c'est que les procedures appelées par Synchronize s'executent bien en meme temps mais une fois que le dernier thread est créé c'est lui qui prend la main et les autres sont bloqués le temps que la procedure soit terminée, bref l'utilisation des threads n'a plus aucun interet...
En esperant avoir été assez clair et que quelqu'un pourra m'aider, merci.
dimanche 4 mars 2007 à 10:56:41 | Re : problème multi-threading

florenth

Membre Club
Réponse acceptée !
Salut,

Ceci est le comportement normal de la procédure Synchronize().
Celle-ci permet d'exécuter une procédure non pas dans le thread que tu viens de créer mais dans le thread principal. Ce qui veut dire que la seule utilité du thread que tu as codé est d'appeler une méthode dans un autre thread !

Voila pourquoi elles s'exécutent les unes après les autres.

Le problème, et apparament tu l'as bien compris, c'est que tu ne peux utiliser les composants de tes fiches que depuis le thread VCL, càd celui qui exécute les messages de l'application.

Ce que tu vas devoir faire, c'est créer le composant de ping dans ton thread (dans le constructeur) et utiliser des propriétés pour ne pas devoir utiliser directement les champs de Form1.
Et ton ping s'effectue directement dans Execute()

Ensuite, pour la mise à jour, tu as plusieurs choix:
- Un évènement appelé par une procédure via Synchronize()
- Un message Windows personnalisé.

Eh oui, le mult-threading demande une grande attention quand à la disponibilité des différents blocs de mémoire car si plusieurs threads peuvent modifier une même zone mémoire en même temps, ça devient vite le fouillis total...

Bonne chance,
Florent
dimanche 4 mars 2007 à 11:23:21 | Re : problème multi-threading

OcHre

Merci pour ces explications éclairantes, je pensais que la procédure Synchronize()  permetait juste d'éviter que plusieurs threads accèdent en écriture au meme espace  mémoire, ceci dit maintenant ca parait assez évident...
Il me reste plus qu'à faire des recherches dans ce sens, merci encore.
mardi 13 mars 2007 à 10:40:46 | Re : problème multi-threading

DeltaFX

Apres il y a les sémaphores, pour régler les cas d'ecriture d'unevar par plusieurs threads.
mardi 13 mars 2007 à 15:11:46 | Re : problème multi-threading

florenth

Membre Club
Oui DeltaFX mais si c'est juste une question d'affichage, je pense qu'un message devrait largement suffire.
dimanche 18 mars 2007 à 10:57:42 | Re : problème multi-threading

DeltaFX

Tout à fait d'accord. Mais tant qu'à faire autant en mettre, ca mange pas de pain, ca fait de l'entrainement, c'est royalement plus propre, surtout si la machine cible est multicore (paske ces threads tournent pas forcément sur le même proc) et ca fait tout de suite plus style, non ?


Cette discussion est classée dans : end, form1, begin, inttostr, part4


Répondre à ce message

Sujets en rapport avec ce message

ListBox -> sendmessage avec message : LB_INSERTSTRING [ par coopertel ] Bonjour,J'ai mis dans les pièces joints le source de mon programme.En fait je voudrais tout simplement utiliser la fct sendmessageavec le message LB_I Probleme de thread :'( [ par Clercq ] Bonjour, Voila, mon probleme c'est qu'après lancement de ma thread et bien .... elle d'arrete à la deuxieme instruction (visualisation par le debug) e Probleme de lecture de fichier avec threads [ par Clercq ] Bonjour,Dans la famille probleme de debutant je demande le graphique...Voili voilou, pour faire mon graphique je lis dans un fichier les valeurs à aff Fenetre MDI [ par develomagaly ] VOila j'ai une fenetre parents avec des fenetres Mdichild qui s'ouvre en cliquant sur le menu. Le but est de ne pas pouvoir ouvrir deux fenetres fille probleme texture [ par damienlann ] Salut,Je debute sous openGl et sous delphi, mais je pense avoir compris le principe general des deux.J'ai déja fait des pg pour débuter qui m'affichen TIdTCPServer réouverture de connexion impossible [ par nitrique ] Bonjour à tous,J'ai une connection TCP/IP indy avec TIdTCPServer et client.Sur le serveur, je lance mon application: OKSur le client je lance mon appl Boucle qui s'auto appelle [ par Francky23012301 ] Salut, Ma source est la suivante : function TForm1.Detection : boolean  ; begin   ......................................... ....................... DBText [ par yannba ] Bonjour,Je fais appel a cette procedure à partir d'un bouton. Celle-ci m'indique "violation d'acces". pourquoi ? <DIV class=smallfont style="MARGIN-B changer le type de separateur [ par 99999 ] bonjour ,j'utilise une fonction pour sauvegarder un stringgrid dans un fichier mais en fait cette fonction me met un separateur "," entre chaque champ Problème tableau, violation d'accès [ par OhAime ] Bonjour,Voilà j'ai ce morceau de code: procedure Tform1.CalculPoint;var i,j,m,n,z : integer; beginFichierINI := Tinifile.Create('d:\


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,746 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales