begin process at 2012 02 11 09:23:18
  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 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 3,182 sec (3)

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