Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Указатель на функцию как параметр для CreateThread

3.9K
08 января 2004 года
Easy Coder
12 / / 07.12.2003
Существует функция вот с таким прототипом:

void DrwTxt(CClientDC);

Объявляю на нее указатель:

void (*pfn)(CClientDC);
pfn = DrwTxt;

При создании потока

HANDLE hThread;
DWORD hTrdID;
hThread = ::CreateThread(NULL, 0, pfn(this), NULL, 0, &hTrdID);

компилятор выдает ошибку конвертации типов. В чем дело??
3
08 января 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Easy Coder
Существует функция вот с таким прототипом:

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;
..............................
}

3.9K
11 января 2004 года
Easy Coder
12 / / 07.12.2003
Пытался сделать что-либо из посоветованного - не вышло ровным счетом ничего.

Сделать вот такой

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. ..."

Ну, вроде, смещение вершины стека неправильно сохраняется... С чего бы это?

// ----------

Одним словом, напишите кто-нить, пожалуйста, кусок кода для создания потока.
461
11 января 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by Easy Coder
Пытался сделать что-либо из посоветованного - не вышло ровным счетом ничего.

Сделать вот такой

DWORD WINAPI (*pfn)(LPVOID);

указатель VC++ не может, ругается на открывающую скобку.



Указатель на функцию типа WINAPI нужно объявлять так:

DWORD (WINAPI *pfn)(LPVOID);

поскольку WINAPI относится к самой функции, а не к возвращаемому ею значению.

3
12 января 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Easy Coder
Одним словом, напишите кто-нить, пожалуйста, кусок кода для создания потока.


Код:
DWORD WINAPI ThreadProc(LPVOID lpParam)
{    
    return 0;
}

int main(int argc, char* argv[])
{
    DWORD dwThreadID;
    HANDLE hThread = CreateThread(NULL, 0, &ThreadProc, 0, 0, &dwThreadID);

    return 0;
}
3.9K
12 января 2004 года
Easy Coder
12 / / 07.12.2003
Все. Разобрался. Спасибо за помощь!:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог