Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > CreateThread не компилиться


Автор: Simeon 25.2.2004, 11:09
Может кто сталкивался.

примеры кода:
1. Так компилится:
//--------------------------------------------------------
extern DWORD WINAPI gate(LPVOID arg);
HANDLE hTHR;
LPDWORD lpThrID=NULL;
hTHR=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)gate,NULL,0,lpThrID);
//---------------------------------------------------------

2. А так нет: omg.gif
//--------------------------------------------------------
class cserver{
public:
static DWORD WINAPI gate(LPVOID arg);
};
//--------------------------------------------------------
cserver server;
HANDLE hTHR;
LPDWORD lpThrID=NULL;
hTHR=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)server.gate,NULL,0,lpThrID);
//---------------------------------------------------------

Пишет:
error C2440: 'type cast' : cannot convert from 'overloaded-function'
to 'LPTHREAD_START_ROUTINE'

Я не понял. Может вообще нельзя методы юзать как потоки.
Но в MSDN об этом нет ни слова.

Автор: Simeon 25.2.2004, 11:39
Проблемма решиласьsmile.gif
Привожу для справки ( может кому понадобится):

Нашел на http://adam.stup.ac.ru/Developer/ArticleDetail.aspx?ar=1576&l=n&mi=106&mic=363

Напрямую вызвать метод как поток нельзя. Есть только workaround( путь в обход)

Создается статическая функция член класса, которая и запускается как поток. В нее передается объект данного класса. А затем вызывается тот метод, который должен работать как поток.

Код:

class CDemo
{
public:
static DWORD WINAPI ThreadStub(LPVOID Parameter)
{
((CDemo*)Parameter)->Thread();
}
void Thread()
{
...
}
};


int main(int argc, char* argv[])
{
CDemo c;
DWORD Dummy;
HANDLE h=CreateThread(NULL,NULL,CDemo::ThreadStub,&c,NULL,&Dummy);
WaitForSingleObject(h,INFINITE);
return 0;
}

Я проверил. Работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)