Si, devi passare B. E' il modo in cui lo fai non va bene.
Questo è classico pezzo di codice che in genere viene usato.
Nota che il parametro da passare alla ThreadProc DEVE essere allocato sull'heap e non posto sullo stack per garantire il corretto lifetime di B.
Nota poi che utilizzo la _beginthreadex e non la _beginthread e non utizzo una _endthreadex dal momento che il thread termina da solo e forzarne l'uscita è sconsigliato.
Ma queste sono scelte di design mie.
codice:
class MainThread {
public:
virtual unsigned run()=0;
virtual ~MainThread() {}
};
class B : public MainThread {
public:
unsigned run() { ... }
// lista parametri
};
unsigned ThreadProc(void* param) {
MainThread* p = static_cast<MainThread>(param);
return p->run();
}
int main ( ... ) {
B* obj = new B;
HANDLE h = reinterpret_cast<HANDLE>(_beginthreadex(NULL,0,ThreadProc,obj ,0,&m_id));
WaitForSingleObject(h,INFINITE);
delete obj;
}