![]() |
|
Модераторы: bsa |
![]()
|
|
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Привет всем!
Проблема: создается новый поток (thread) которому передается указатель на функцию, нужно чтоб при создании каждого нового потока передавался указатель на функцию какогото обьекта. Нет никаких возможностей передавать указатель this функции. Мое теоретическое решение: нужно при создании потока передавать ему адресс на копию глобальной функции где уже есть этот указатель this на нужный нам обьект, вот только я незнаю можно вообще это реализовать, пробовал при помощи шаблонов - ничего не получилось, писал примерно так:
выдает ошибку: invalid template argument for 'myfunc', expected compile-time constant expression. Скажите пожалуйста это вообще возможно? если да то как? |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
где код?
Если поток создаётся при помощи boost::thread или С++0x std::thread, то это делается довольно просто. Если средствами ОС, то надо дополнительно написать код. Это сообщение отредактировал(а) Леопольд - 5.12.2010, 13:23 -------------------- вопросов больше чем ответов |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Леопольд, код слишком большой, да и выглядит он неочень, не используются ни boost ни C++0x.
Вообщето проблема состоит именно в том что у меня нет доступа к функции создающей поток, я ей передаю указатель на функцию которая будет вызыватся из созданного потока с определенными параметрами к которым у меня тоже нет доступа. Вобщем это call-back функция, которую я хочу сделать членом какогото обьекта (не static в классе). |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
http://codepad.org/7JjXSXkR Добавлено @ 13:40 Напиши минимальный код, который треbуется. Нужно, хотя bы, увидеть интерфейс который ты используешь (т.е. все сигнатуры функций). Пока не до конца понятно, что именно надо. Недавно поднималась тема про колbяки http://forum.vingrad.ru/forum/topic-316218.html Может что-то похожее? Это сообщение отредактировал(а) Леопольд - 5.12.2010, 13:51 -------------------- вопросов больше чем ответов |
|||
|
||||
| asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
выглядит все примерно так:
есть библиотека которая читает поток данных с определенного девайса и передает эти данные моей функции.
так все работает нормально, но мне нужно создать чтото наподобие этого:
|
||||
|
|||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Вызов нестатического метода класса треbует указатель на инстанс. Этот указатель надо как-то передать. Как это сделать в многопоточном приложении, не знаю. Если однопоточное, то, остаётся вариант с глоbальной переменной. Это сообщение отредактировал(а) Леопольд - 5.12.2010, 14:28 -------------------- вопросов больше чем ответов |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Леопольд, в обшем мне нужно чтоб функция обрабатывалась как обьект, тоесть если имеем:
то нужно скопировать эту функцию в новое место, изменить значение 'x' и передать указатель на функцию создателю потока. Тоесть я просто могу посчитать размер функции после компиляции, вызвать malloc(sizeof(myfunc)) (знаю что это не должно сработать), потом memcpy и после просто по адрессу 'x' изменить 0 на нужное значение. Но насколько я понимаю static int x это просто глобальная переменная которая будет видна только из myfunc(), а хотелось чтоб она была бы прямо в коде ) Возможно ли в с++ такое обращение с функциями? |
|||
|
||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
||||
|
|||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Леопольд, это хороший пример работы с шаблонами )
но этот код не позволяет сделать что-то наподобие этого:
проблема именно в том чтоб можно было передавать шаблону переменные, которые он категорически отказывается принимать ( |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Значит надо оbходиться теми, которые он принимает:
http://codepad.org/Kvel9b35
-------------------- вопросов больше чем ответов |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Леопольд, спасибо, это сойдет, не для общего случая, но в моем случае могут быть не более 4 обьектов, просто было интересно реализовать чтото подобное в runtime'e )
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Для общего лучше использовать boost::thread, если текущий стандарт С++, в будущем стандарте std::thread или std::async.
Вот небольшой пример:
Это сообщение отредактировал(а) Леопольд - 6.12.2010, 06:35 -------------------- вопросов больше чем ответов |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |