Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : problème multi-threading [ Divers / Débutant(e) ] (OcHre)

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é 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...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.