Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Создание потока внутри класса


Автор: Smarts 5.5.2007, 17:47
Допустим есть некоторый класс CClass1 и в нем функция CClass1::Func1;
Если попытаться передать в CreateThread функцию из класса, то выходит такая ошибка: 
Код

error C3867: 'CClass1::Func1': function call missing argument list; use '&CClass1::Func1' to create a pointer to member

Ок, ставим значек адреса и получаем вот это: 
Код

error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (__stdcall CClass1::* )(LPVOID)' to 'LPTHREAD_START_ROUTINE'

Если создать функцию с точно такими же параметрами, но вне класса, то все проходит отлично... 
Можно ли как-нибудь это сделать не выводя функцию за пределы класса?

Автор: DigitSphinx 5.5.2007, 19:40
я тоже сталкивался с такой проблемой , пришлось создать специальную функцию (делала тоже самое что и собственная функция класса но была отточена под функцию потока) и структуру которая содержала указатель на объект класса и некоторые дополнительные данные, затем я создавал поток и кидал туда ссылки на функцию и объект структуры , этим моя проблема была решена , надеюсь что тебе тоже поможет  smile 

Автор: Smarts 6.5.2007, 02:35
Можешь пояснить что за специальная функция и дополнительные данные? smile
Хотелось бы сделать все это внутри класса не передавая в CreateThread внешних функций.
Кстати, если сделать ассемблерную вставку с push & call (чтобы передать запрещенные аргументы), глючить в результате не будет? По идее та же функция и тот же указатель, только компилятор почему-то ругается если она внутри класса...

Автор: Жуть 6.5.2007, 03:09
Класс создает поток, в котором создает процесс...
также смотри http://forum.sources.ru/index.php?showtopic=118174&hl=%CF%EE%F2%EE%EA

Автор: Greeen 6.5.2007, 12:15
Smarts, метод статическим сделай.

Автор: Earnest 7.5.2007, 18:04
Цитата(Smarts @  6.5.2007,  03:35 Найти цитируемый пост)
По идее та же функция и тот же указатель, только компилятор почему-то ругается если она внутри класса... 

Та же, да не та. И указатель, кстати, тоже совсем не тот.
Если функция та же, то как, по-твоему, она получает доступ к данным класса? Советую подумать над этим: всегда полезно понимать, как оно там устроено.
Сделать ассемблерную вставку очень полезно: глючить, конечно, будет по черному, но зато сравнишь код внешней функции и функции-члена класса и разберешься, в чем там разница.


Автор: En_t_end 7.5.2007, 18:14
http://forum.vingrad.ru/forum/topic-107767.html

Автор: Smarts 7.5.2007, 19:15
Earnest, я разобрался уже, несоответствие типов происходит из-за метода вызова __thiscall, так как кроме обычных параметров еще и указатель this передается.
Решил проблему созданием отдельного класса со статической функцией, которая вызывает нужную мне функцию потока (виртуальную), а в своем классе перегружаю ее уже с требуемым кодом.

Автор: Earnest 8.5.2007, 07:41
Smarts, все правильно, так и делают.

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