Указатель на функцию как параметр для CreateThread
void DrwTxt(CClientDC);
Объявляю на нее указатель:
void (*pfn)(CClientDC);
pfn = DrwTxt;
При создании потока
HANDLE hThread;
DWORD hTrdID;
hThread = ::CreateThread(NULL, 0, pfn(this), NULL, 0, &hTrdID);
компилятор выдает ошибку конвертации типов. В чем дело??
Существует функция вот с таким прототипом:
void DrwTxt(CClientDC);
Объявляю на нее указатель:
void (*pfn)(CClientDC);
pfn = DrwTxt;
При создании потока
HANDLE hThread;
DWORD hTrdID;
hThread = ::CreateThread(NULL, 0, pfn(this), NULL, 0, &hTrdID);
компилятор выдает ошибку конвертации типов. В чем дело??
В том, что ты передаешь аргумент не того типа - это раз, передаешь неправильно - это два.
1. Надо передавать указатель на метод типа
DWORD WINAPI (*)(LPVOID), а не void (*)(CClientDC).
2. Ты пытаешься передать результат выполнения метода, т.е. void, т.к. запись pfn(this) - указвает, что нужно выполнить метод, на который указывает pfn, с параметром this.
Что делать:
1. Пытаться привести тип твоего указателя к нужному типу не имеет смысла. Поэтому, либо измени параметры вызова своего метода и тип возвращаемого значения, либо пиши враппер над своим методом.
2. Предавать надо именно указатель, т.е. если считать что указатель у тебя уже имеет правильный тип, то вызов будет выглядеть так:
DWORD ThreadId;
HANDLE hThread = ::CreateThread(NULL, 0, pfn, NULL, 0, &ThreadId);
Указатель на объект (у тебя, как я понял, непосредственно this) можно передать так:
DWORD ThreadId;
HANDLE hThread = ::CreateThread(NULL, 0, pfn, (void*)this, 0, &ThreadId);
А потом в самом методе получить так:
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
CClientDC* pDC = (CClientDC*)lpParameter;
..............................
}
Сделать вот такой
DWORD WINAPI (*pfn)(LPVOID);
указатель VC++ не может, ругается на открывающую скобку.
Если же функцию и указатель объявлять без 'WINAPI', т.е.:
DWORD DrwTxt(LPVOID lpParam);
DWORD (*pfn)(LPVOID);
pfn = DrwTxt;
...
hThread = ::CreateThread(NULL, 0, pfn, (void *)this, 0, &hTrdID);
то компилятор не может конвертировать тип третьего параметра
из unsigned long (__cdecl *)(void *)
в unsigned long (__stdcall *)(void *)
// ----------
Еще пробовал создать поток, без использования указателя:
DWORD WINAPI DrwTxt(LPVOID lpParam);
...
hThread = ::CreateThread(NULL, 0, DrwTxt, (void *)this, 0, &hTrdID);
Так вот, при запуске проги появляется 'Debug Error' с сообщением:
"The value of ESP was not properly saved across a function call. ..."
Ну, вроде, смещение вершины стека неправильно сохраняется... С чего бы это?
// ----------
Одним словом, напишите кто-нить, пожалуйста, кусок кода для создания потока.
Пытался сделать что-либо из посоветованного - не вышло ровным счетом ничего.
Сделать вот такой
DWORD WINAPI (*pfn)(LPVOID);
указатель VC++ не может, ругается на открывающую скобку.
Указатель на функцию типа WINAPI нужно объявлять так:
DWORD (WINAPI *pfn)(LPVOID);
поскольку WINAPI относится к самой функции, а не к возвращаемому ею значению.
Одним словом, напишите кто-нить, пожалуйста, кусок кода для создания потока.
{
return 0;
}
int main(int argc, char* argv[])
{
DWORD dwThreadID;
HANDLE hThread = CreateThread(NULL, 0, &ThreadProc, 0, 0, &dwThreadID);
return 0;
}