Pd de création de thread avec dev-c++

Signaler
Messages postés
9
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 mai 2004
-
Messages postés
9
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 mai 2004
-
j'ai des problèmes pour créer une thread avec dev-c++

ça compile, mais ça plante :(((

voici l'appel à CreateThread :

CreateThread (THREAD_PRIORITY_NORMAL, 0,
(DWORD (__stdcall *)(void *))Process->Run(),
(void *)Process, 0,(DWORD*)CREATE_SUSPENDED);

à savoir que j'ai fait aussi le test avec _beginthreadex et ça plante aussi ...

plz help me !

jefffii

10 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
c'est sur que ça compile vu tous les cast brutaux que tu fait
(le dernier est pas mal, tu caste une constante en un pointeur!!!)

point d'entrée du thread (si dans une classe, doit être une fonction static, l'objet associé peut être passé en param lors de CreateThread et récupéré dans lpData):
DWORD WINAPI ThreadFunc(LPVOID lpData)
{
// du code ici
return 0;
}

// création du thread (NULL peut être remplacé par un pointeur sur une classe ou une struct):
DWORD dwThreadId;
HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, CREATE_SUSPENDED, &dwThreadId);

// pour modifier la priorité :
SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL);

// si créé avec CREATE_SUSPENDED, il faut démarrer le thread
ResumeThread(hThread);
Messages postés
9
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 mai 2004

ben là le problème c'est que je n'arrive pu à compiler

code :

DWORD dwThreadId;
Process->hThread = CreateThread (NULL, 0,
Process->Run,
NULL, CREATE_SUSPENDED, &dwThreadId);

SetThreadPriority(Process->hThread,
THREAD_PRIORITY_NORMAL);

erreurs de compil :

C:\Dev-Cpp\Projets\AppDlg.cpp
no matches converting function `Run' to type `DWORD (*)(void*)'

C:\Dev-Cpp\Projets\CThread.hpp
candidates are: virtual DWORD CThread::Run(void*)
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
met moi-le header de la classe ou est définie ta fct de thread.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Si tu fais du C++ (qu'il y a histoire de classe dans le thread), emploie _beginthreadex au lieu de CreateThread sinon fuites memoire.
Lis Richter qui explique le pourquoi en details.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
9
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 mai 2004

class CThread
{
public:

CThread ();
virtual ~CThread();
public:
virtual BOOL InitInstance();
DWORD WINAPI Run(LPVOID lpData);

void setOwner(CAppDlg* ptrDialog)
{ptrDlg = ptrDialog;}
int running;

HANDLE hThread;

private:
CAppDlg* ptrDlg;

};

construction :

CThread::CThread()
:ptrDlg(NULL)
{
hThread = CreateThread(NULL, 0, (DWORD (__stdcall *)(void *)) Run(0), 0, CREATE_SUSPENDED, NULL);
}

jefffii
Messages postés
9
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 mai 2004

class CThread
{
public:

CThread ();
virtual ~CThread();
public:
virtual BOOL InitInstance();
int Run(void * lpData);

void setOwner(CAppDlg* ptrDialog)
{ptrDlg = ptrDialog;}
int running;

unsigned long m_Thread;

private:
CAppDlg* ptrDlg;

};

construction :

CThread::CThread()
:ptrDlg(NULL)
{
m_Thread = _beginthreadex(NULL, 0, (unsigned (__stdcall *)(void *)) Run(0), 0, CREATE_SUSPENDED, NULL);
}

ça n'est pas plus concluant ... plantage :(((

jefffii
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
int Run(void * lpData);

Doit etre __stdcall, declaree 'static' et pas autrement !!!
Comme te l'a deja dit ymca2003, tes cast brutaux ne font que forcer le compilo a accepter de compiler, aucun risque que puisse tourner.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
9
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 mai 2004

effectivement la fonction static est la chose à faire mais j'ai un problème d'édition de liens

dans cette même fonction, j'utilise ptrDlg qui est maintenant static mais j'ai un problème C:\Dev-Cpp\Projets\CThread.o(.text+0x181):C:\Dev-Cpp\Projets\WinEmboss3\WinEmboss2\serialThread.cpp
more undefined references to `CThread::ptrDlg' follow

jefffii
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
si tu as mis ptrDlg en static, il ne faut pas aoublier de rajouter dans le .cpp :

CAppDlg* CThread::ptrDlg;
Messages postés
9
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
14 mai 2004

dans ma fonction run j'essai d'accéder à des données-membres de ptrDlg mais je n'y arrive pas ça foire à l'édition de liens comme ci-dessus

jefffii