Bonjour a tous,
voila je voudrais savoir si lors de la création d'un thread dans sa méthode execute, on pouvait créee un objet.
Je fais cela afin d'améliorer la vitesse d'execution d'un ancien prog.
Merci
Version imprimable
Bonjour a tous,
voila je voudrais savoir si lors de la création d'un thread dans sa méthode execute, on pouvait créee un objet.
Je fais cela afin d'améliorer la vitesse d'execution d'un ancien prog.
Merci
Salut,
on ne va pas pouvoir te répondre car on ne sait pas quelle bibliothèque tu utilises et sur quelle os tu es.
Si tu peux en profiter pour nous mettre un exemple (qui ne compile pas forcément) pour illustrer ce que tu veux faire, ça serait bien ;).
J'utilise la classe TThread
J'éssai de scanner un reseau et je voudrais crée un thread pour chaque IpCode:
1
2
3
4
5
6
7
8
9
10 class TMyThread : public TThread { private: AnsiString Val; protected: void __fastcall Execute(); void __fastcall Affichage(); public: __fastcall TMyThread(AnsiString); };
Code:
1
2
3
4
5
6
7
8 AnsiString DebIp = "192.168.2." ; for(int i = 1; i<=255; i++) { AnsiString Ipbis = DebIp + i; myThread = new TMyThread(Ipbis); } Form1->Memo1->Lines->Add("fin");
Je ne vois pas toujours pas le problème. Je ne connais pas AnsiString et les directives __fastcall donc mon jugement sera peut être compromis.
Néanmoins je ne vois pas qu'est-ce qui t'empêche de créer un objet dans la méthode Execute ?
De plus, si on regarde ta boucle :
Il y a de grosses fuites mémoire ... Création de 255 threads mais libération (supposée) que du dernier... En plus je ne sais pas comment tu vas lancer ta méthode execute sur chacun des threads après. Tu peux toujours faire quelque chose comme :Code:
1
2
3
4
5
6 for(int i = 1; i<=255; i++) { AnsiString Ipbis = DebIp + i; myThread = new TMyThread(Ipbis); }
Ou alors stocker les threads dans un tableau si tu en as encore besoin plus tard.Code:
1
2
3
4 for(int i = 1; i<=255; i++) { TMyThread(DebIp + i).execute(); }
Finalement, il n'est pas d'usage (ni en C++, ni ailleurs à ce que je sache) de mettre une majuscule au nom de méthode ;)
HTH
Tu dis que je peux stocker les Threads dans un tableau ? Cela m'interresse car effectivement j'aurais besoin de les réutiliser plus tards.
Cela ce comporte comme un tableau de chaine caractère ?
Comment cela passe t-il au niveau de l'execution? Si je lance une méthode sur un thread de mon tableau, peut t-il l'executer sur tout les thread en meme temps, ou doit -il les reprendre un a un ?
Hmmm, je te conseille de prendre un livre sur le C++ parce que je ne sais pas comment tu vas t'en sortir pour faire des choses assez compliquées (manipuler des threads n'est pas trivial) en ayant si peu de connaissances...
Sinon tu peux faire :
Tu dois les parcourir un par un pour lancer la méthode sur chacun d'eux, après il existe d'autre technique qu'une boucle for, peut-être plus élégante, mais je pense que tu peux t'en passer.Code:
1
2
3 std::vector<TMyThread> threadPool; for(int i=1; i <= 255; ++i) threadPool.push_back(TMyThread(DebIp + i));
Oui je sais, mais va t-il les executer a la suite ou attendre que chaqu'un est fini sa méthode avant d'en lancer un autre ?
Pour l'appel de la fonction Execute(), elle est appeler automatiquement.
Autrement, je passe 'true' à mon constructeur de thread et j'appelle la fonction Execute() directement dedans non?Citation:
"Si le constructeur de la classe TThread reçoit false en argument, la fonction Execute du thread démarre aussitôt le thread créé."
Pour la libération des thread, ils sont libérés automatiquement lors de la fin de la fonction Execute () non?
Citation:
Un thread se termine également lorsque sa fonction Execute se termine.
Euh, non, si tu crées des objets par new (ce qu'on appelle de l'allocation dynamique) tu déclares de ce fait que tu vas gérer toi-même la mémoire, donc elle n'est libérée que par une instruction delete sur ton objet.Citation:
Pour la libération des thread, ils sont libérés automatiquement lors de la fin de la fonction Execute () non?
Citation:
Un thread se termine également lorsque sa fonction Execute se termine.
Ex:
Le problème c'est que si tu mets myThread = new TMyThread(Ipbis); dans une boucle, à chaque tour de boucle le pointeur créé au tour précédent est perdu, donc tu ne l'as plus pour appeler delete dessus --> ton objet n'est jamais libéré (fuite mémoire)Code:
1
2
3
4
5 myThread = new TMyThread(Ipbis); ... //quand l'objet devient inutile: delete myThread
Merci a tous !