Newsgroup: it.comp.lang.c++
Titolo: template thread e problemi...

Ciao a tutti, 
sto cercando di implementare una classe per la gestione dei thread,
quello che mi interessa è riuscire a lanciare una funzione di una
classe in un thread di esecuzione differente da quello principale.
Dopo varie prove sono giunto a quanto riportato sotto, VC++ mi da un
"fatal error C1001: INTERNAL COMPILER ERROR".
Il problema è che la linea dell'errore non corrisponde assolutamente
ad una qualche linea all'interno del codice che ho riportato.
Ovviamente cambiando il codice con cui lancio il thread l'erreore si
presenta lo stesso ma in punti differenti del sorgente. Quello che
vorrei sapere è se la sintassi che sto utilizzando è corretta e se
l'errore è dovuto al compilatore o a me.
Grazie anticipatamente, 
Stefano.
//*** Inizio codice ***
#ifndef __CTHREAD_H__
#define __CTHREAD_H__
//*********************************************************
template<class A> typedef DWORD (A::*ThreadFun)(LPVOID);
//*********************************************************
template<class A> class CThread
{
private:
	DWORD threadID;
	HANDLE hThread;
	static DWORD WINAPI _ThreadProc(LPVOID lpParameter);
	static A* obj;
	static ThreadFun tFun;
public:
	CThread();
	virtual ~CThread();
	//***************************
	BOOL Run(A* obj, DWORD (A::*ThreadFun)(LPVOID), LPVOID
lpParameter);
	BOOL isRunning(void);
	void WaitThreadEnd(void);
};
//*********************************************************
template<class A> CThread<A>::CThread()
{};
template<class A> CThread<A>::~CThread()
{};
template<class A> A* CThread<A>::obj;
template<class A> ThreadFun CThread<A>::tFun;
template<class A> DWORD WINAPI CThread<A>::_ThreadProc(LPVOID
lpParameter)
{
	DWORD retval=(obj->*(tFun))(lpParameter);
	return retval;
};
template<class A> BOOL CThread<A>::Run(A* obj, DWORD
(A::*ThreadFun)(LPVOID), LPVOID lpParameter)
{
	if(!isRunning())
	{
		CThread<A>::obj=obj;
		CThread<A>::tFun=ThreadFun;
hThread=CreateThread(NULL,0,_ThreadProc,lpParameter,0,&threadID);
		return hThread!=NULL;
	}
	return FALSE;
};
template<class A> BOOL CThread<A>::isRunning(void)
{
	return WaitForSingleObject(hThread,0)==WAIT_TIMEOUT;
};
template<class A> void CThread<A>::WaitThreadEnd(void)
{
	WaitForSingleObject(hThread,INFINITE);
};
#endif //#ifndef __CTHREAD_H__
//*** Fine codice ***
Stefano
sstaeT...@aruba.it
(occhio all'antispam)


Ho qualche dubbio se questa sintassi sia standard o meno. Comunque sono
sicuro che puoi inserire tale definizione all'interno del template CThread
//*********************************************************
//template<class A> typedef DWORD (A::*ThreadFun)(LPVOID);
//*********************************************************
template<class A> class CThread
{
private:
DWORD threadID;
HANDLE hThread;
static DWORD WINAPI _ThreadProc(LPVOID lpParameter);
static A* obj;
typedef DWORD (A::*ThreadFun)(LPVOID);
static ThreadFun tFun;
...
...
};
Ciao
Fabio

 Ho qualche dubbio se questa sintassi sia standard o meno.
Questa sintassi non è, in effetti, prevista nel C++ standard.
Max


Rispondo qui anche a Max M.
Che la sintassi:
	template<class A> typedef DWORD (A::*ThreadFun)(LPVOID);
non sia prevista non lo sapevo, comunque all'inizio la classe l'ho
scritta come mi hai suggerito tu, il problema č che non so come
istanziare:
	static ThreadFun tFun;
all'esterno della classe essendo un membro static.
Penso sia una mia lacuna sintattica.
grazie
Ste.
