TThread et multiprocesseur
Salut à tous,
A chaque jour son petit sujet...
Je travail sur la création de thread afin de faire du "parallèle". Voici le petit thread de chronométrage que j'ai "créé" :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #ifndef chronometreH
#define chronometreH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class ThChrono : public TThread
{
private:
protected:
void __fastcall Execute();
void __fastcall AffMessage();
public:
__fastcall ThChrono(bool CreateSuspended);
LARGE_INTEGER start; //!< The start time of the chronometer
LARGE_INTEGER tic;
LARGE_INTEGER FQPF;
bool HRPCAvail; //!< Is there an available HRPC
AnsiString millit;
double result;
};
//---------------------------------------------------------------------------
#endif |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <vcl.h>
#pragma hdrstop
#include "chronometre.h"
#include "page_essai.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall ThChrono::ThChrono(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall ThChrono::Execute()
{
HRPCAvail=QueryPerformanceCounter(&start); //memo du temps de start
if (!HRPCAvail) //si le compteur n'était pas disponible
{
start.LowPart = ::GetTickCount(); //basse resolution
start.HighPart = 0;
}
while (!Terminated)
{
if (HRPCAvail) //si le compteur haute resolution était dispo
{
QueryPerformanceCounter(&tic); //recup du temps
QueryPerformanceFrequency(&FQPF); //recup de la frequence
//resultat en msec
result=static_cast<double>(tic.QuadPart - start.QuadPart) * 1000
/static_cast<double>(FQPF.QuadPart);
}
else //si le compteur n'était pas disponible
{
tic.LowPart = ::GetTickCount();
tic.HighPart = 0;
result = 0;
//resultat
result=tic.LowPart - start.LowPart;
}
millit = AnsiString(result);
Synchronize(AffMessage);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall ThChrono::AffMessage()
{
ecran_essai->Label1->Caption = millit;
} |
Je met créé entre guillemet car j'ai énormément pompé sur le code trouvé dans ce poste
Ma question est de savoir s'il existe un moyen de s'assurer ou de forcer l'utilisation des différents cœurs du PC? Un coeur pour le process principal et un autre pour les threads.
Même si mon process n'est composé que de tâches durant plusieurs centième de seconde, que ce chrono est "riche" pour mon utilisation, je préfère assuré le process.
un Thread qui lance un autre thread
slt à toutes et à tous,
Je suis entrain de programmer une application qui doit exécuter 2 threads en même temps (avec c++builder). mais le premier thread doit faire une itération ensuite il lance le deuxième thread.
pour cela dans le programme principale, j'utilise la fonction Resume(); pour lancer le premier thread . et dans le corps du premier thread j'utilise aussi Resume(); pour lancer le deuxieme.
Néanmoins, lorsque je lance mon application, je m'aperçois que le thread 1 fonctionne bien mais que le 2 n'est pas activé. Il s'active uniquement lorsque le 1 se termine.
donc pas de parallélisme , je ne sais pas est ce que je doit ajouter quelque chose:calim2: