begin process at 2010 02 10 03:17:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Pb thread ss classe


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

Pb thread ss classe

vendredi 25 juin 2004 à 10:16:11 | Pb thread ss classe

robbynaze

bonjour à tous, j'ai le problème suivant :
l'utilisation des threads ss le main ne pause aucun problème, mais lorsque j'essaye de l'intégrer dans une classe (pour acquisition de données sur port série), j'ai le message d'erreur suivant :
error C2664: 'Attach' : cannot convert parameter 1 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'

l'utilisation d'une méthode de la classe en tant que routine attachée au thread est-elle possible ? merci de votre aide ...

sources :
test.cpp
//------------------------------------------------------------------------------
// Test
#include "stdafx.h"
#include "test.h"
#include <conio.h>
#include "cThread.h"

CWinApp theApp;
using namespace std;
DWORD WINAPI fThread2( LPVOID );

// cAcquisition
class cAcquisition {
public:
cThread Thread1;
cAcquisition();
virtual ~cAcquisition();
Start();
Stop();
DWORD WINAPI fThread1( LPVOID ); };

//------------------------------------------------------------------------------
// fThread2
DWORD WINAPI fThread2( LPVOID )
{
while(1) { printf("\nfThread_Boucle2"); Sleep(1000); };
}

//------------------------------------------------------------------------------
// cAcquisition
cAcquisition::cAcquisition() {};

cAcquisition::~cAcquisition(){};

cAcquisition::Start() {
Thread1.Attach(fThread1);
Thread1.Start();
};

cAcquisition::Stop() {
Thread1.Stop(); };

DWORD WINAPI cAcquisition::fThread1( LPVOID ) {
while(1) { printf("\nfThread1"); Sleep(1000); } };

//------------------------------------------------------------------------------
// main
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
cAcquisition Acquis;
cThread Thread2;

if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
printf("erreur init afx"); return 1; }

Acquis.Start();
Thread2.Attach(fThread2);
Thread2.Start();
while(!kbhit()) {}
Thread2.Stop();
Acquis.Stop ();

return 0;
}


test.cpp
//-------------------------------------------------------------------------------
// cThread.h

#ifndef __CTHREAD_H__
#define __CTHREAD_H__
#include <windows.h>

class cThread
{
public:
cThread() { m_pThreadFunc = cThread::EntryPoint;}

cThread(LPTHREAD_START_ROUTINE lpExternalRoutine) { Attach(lpExternalRoutine); }

~cThread() { if ( m_ThreadCtx.m_hThread ) Stop(true); }

DWORD Start( void* arg = NULL ) {
m_ThreadCtx.m_pUserData = arg;
m_ThreadCtx.m_hThread = CreateThread(NULL, 0, m_pThreadFunc, this, 0, &m_ThreadCtx.m_dwTID);
m_ThreadCtx.m_dwExitCode = (DWORD)-1;
return GetLastError(); }

DWORD Stop ( bool bForceKill = false ) {
if ( m_ThreadCtx.m_hThread ) {
GetExitCodeThread(m_ThreadCtx.m_hThread, &m_ThreadCtx.m_dwExitCode);
if ( m_ThreadCtx.m_dwExitCode == STILL_ACTIVE && bForceKill )
TerminateThread(m_ThreadCtx.m_hThread, DWORD(-1));
m_ThreadCtx.m_hThread = NULL; }
return m_ThreadCtx.m_dwExitCode; }

DWORD GetExitCode() const {
if ( m_ThreadCtx.m_hThread )
GetExitCodeThread(m_ThreadCtx.m_hThread, (LPDWORD)&m_ThreadCtx.m_dwExitCode);
return m_ThreadCtx.m_dwExitCode; }

void Attach( LPTHREAD_START_ROUTINE lpThreadFunc ){
m_pThreadFunc = lpThreadFunc; }

void Detach( void ){
m_pThreadFunc = cThread::EntryPoint; }

protected:
static DWORD WINAPI EntryPoint( LPVOID pArg) {
cThread *pParent = reinterpret_cast<cThread*>(pArg);
pParent->ThreadCtor();
pParent->Run( pParent->m_ThreadCtx.m_pUserData );
pParent->ThreadDtor();
return STILL_ACTIVE; }

virtual DWORD Run( LPVOID /* arg */ ) { return m_ThreadCtx.m_dwExitCode; }
virtual void ThreadCtor(){ }
virtual void ThreadDtor(){ }

private:
class cThreadContext {
public:
cThreadContext(){ memset(this, 0, sizeof(this));}

public:
HANDLE m_hThread; // The Thread Handle
DWORD m_dwTID; // The Thread ID
LPVOID m_pUserData; // The user data pointer
LPVOID m_pParent; // The this pointer of the parent cThread object
DWORD m_dwExitCode; // The Exit Code of the thread
};

protected:
cThreadContext m_ThreadCtx; // The Thread Context member
LPTHREAD_START_ROUTINE m_pThreadFunc; // The Worker Thread Function Pointer
};

#endif //__CTHREAD_H__
vendredi 25 juin 2004 à 10:42:49 | Re : Pb thread ss classe

BruNews

Administrateur CodeS-SourceS
ENCORE....
Declarer fonction static car systeme doir connaitre son adresse a la compilation.

ciao...
BruNews, Admin CS, MVP Visual C++


Cette discussion est classée dans : start, dword, threadctx, cthread, cacquisition


Répondre à ce message

Sujets en rapport avec ce message

LPTHREAD_START_ROUTINE [ par hobbes ] Qu est ce que c est : LPTHREAD_START_ROUTINE ????? thread et paramètres [ par sena ] sujet : thread et paramètresbonjour,voila j'ai fait un petit programme de test pour l'éxcution de thread.je souahiterais faire la même chose en passan Conversion d'un DWORD en chaîne de caractères [ par annplop ] Bonjour,je code en c++ (avec visual c++ 6), et j'ai besoin de convertir une variable de type DWORD en chaîne de caractères.Est-ce possible et si oui c Pb avec CreateThread !!! [ par jujunio ] Bonjour, J'ai toujours le même pb avec la création d'une tâche!!MON PROG :DWORD WINAPI Blick::lireCOM(LPVOID ptr){ while (1){...}}int Blick::appli(){ REG_DWORD [ par Xentor609 ] Lorsque je recupere la valeur d'une clé avec RegEnumValue,celle-ci doit etre stockée dans un BYTE. Quand le type de la valeur recupérée est un REG_SZ, ScannerIP() [ par JCpp ] Il y a-t-il un moyen d'ouvrir 100 Theard sans écrire :DWORD WINAPI ScaneIP1(LPVOID param){..}DWORD WINAPI ScaneIP2(LPVOID param){..}. Problème de compilation d'une Dll [ par DrUn ] Bonjour, J'ai une Dll qui a été compilée par visual c++ il y a quelques temps. Cette Dll fait du WinHTTP. Elle n'a pas été modifiée et mon SDK non plu Prob de thread [ par sebastienbro ] Bonjour, j'ai un problème avec des thread, je n'arrive pas a en créer un :(Voici mon code : HANDLE hThread1;DWORD dwThreadId1;DWORD WINAPI T RegOpenKeyEx [ par guitoulefoux ] Bonjour,Pourriez vous m'aider a corriger mon erreur.Voici mon bout de code :TCHAR MenDema[1024];[...]HKEY hKey;RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWA transformer un jour du mois en DWORD [ par myocean ] Dans le cas de la structure AT_INFOla variable DaysOfMonth est au format DWORD et elle recoit comme paramêtre des bit où le bit 0 est le 1er du mois


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 0,312 sec (4)

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