Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание потока внутри класса, Error при передаче указателя на функцию 
V
    Опции темы
Smarts
Дата 5.5.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Допустим есть некоторый класс 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'

Если создать функцию с точно такими же параметрами, но вне класса, то все проходит отлично... 
Можно ли как-нибудь это сделать не выводя функцию за пределы класса?
PM MAIL   Вверх
DigitSphinx
Дата 5.5.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: нет
Всего: 3



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


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Smarts
Дата 6.5.2007, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Можешь пояснить что за специальная функция и дополнительные данные? smile
Хотелось бы сделать все это внутри класса не передавая в CreateThread внешних функций.
Кстати, если сделать ассемблерную вставку с push & call (чтобы передать запрещенные аргументы), глючить в результате не будет? По идее та же функция и тот же указатель, только компилятор почему-то ругается если она внутри класса...
PM MAIL   Вверх
Жуть
Дата 6.5.2007, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 27.6.2006

Репутация: нет
Всего: нет



Класс создает поток, в котором создает процесс...
также смотри другой форум

Это сообщение отредактировал(а) Жуть - 6.5.2007, 03:12

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  Command.rar 2,57 Kb
PM MAIL   Вверх
Greeen
Дата 6.5.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



Smarts, метод статическим сделай.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Earnest
Дата 7.5.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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




--------------------
...
PM   Вверх
En_t_end
Дата 7.5.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



PM MAIL ICQ Skype GTalk Jabber   Вверх
Smarts
Дата 7.5.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Earnest, я разобрался уже, несоответствие типов происходит из-за метода вызова __thiscall, так как кроме обычных параметров еще и указатель this передается.
Решил проблему созданием отдельного класса со статической функцией, которая вызывает нужную мне функцию потока (виртуальную), а в своем классе перегружаю ее уже с требуемым кодом.
PM MAIL   Вверх
Earnest
Дата 8.5.2007, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Smarts, все правильно, так и делают.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.