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__