![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ??? |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.3.2004 Репутация: нет Всего: нет |
Необходимо динамически создавать потоки (CreateThread), указывая как основную функцию некую функцию класса. Т.е. сначала создается объект, затем создается поток, которому назначается некоторая функция этого объекта. Каким образом можно реализовать это, и вообще какие подходы можно определить? Спасибо.
|
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
стоит во первых ознакомиться с потоковыми методами програмирования
(примеры "покупки молока" и примеры "производителя и потребителя", в общем проблемы "критического участка" кода, когда важно обеспечить контроль входа в определённый участок кода) далее стоит почитать MSDN на предмет инструментов данных в виндах для целей поддержки Потоков (class CWinThread, CreateEvent(), и т.д.) ....блин "Потоки" а дальше пойдёт как по маслу. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| ??? |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.3.2004 Репутация: нет Всего: нет |
Значит, мало слышал. Треды, нити, потоки - в принципе, проблема названий к теме имеет отношение малое. MFC оставим в стороне, а также и проблемы синхронизации. Собственно, вопрос состоял в том, а можно ли каким-либо способом динамическую функцию объекта привести к виду LPTHREAD_START_ROUTINE. Вообще-то, для потока это вовсе не обязательно: можно использовать и статическую функцию, передав в параметре потоку указатель на объект, т.е. явная передача this. Меня интересовала в принципе возможность указания динамической функции и не более... В теории, это невозможно, ну, мне так кажется. Ладно, тема исчерпана, извините и спасибо за внимание. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
2 ???
можно и без статической функции, используя указатель на метод объекта (см. FAQ), но через глобальную функцию. То есть, поток реально создаётся на глобальную ф-цию, в которую через LPVOID передаётся пара значений "указатель на объект" / "указатель на метод", и далее глоб. функция вызывает метод по указателю. Хоть данный метод и кажется замороченным, но в реальности получается что можно создать поток на любой метод любого класса (можно даже написать специальный шаблон функции, который будет принимать указатель на объект и указатель на метод, и создавать поток). -------------------- ![]() |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
Дорогой "???" можно использовать любую функцию к которой у тебя есть доступ из "this", но принято, что эта функция - возвращает void. a динамическая она или нет - дело твоё.
-------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| ??? |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.3.2004 Репутация: нет Всего: нет |
bilbobagginz, в том-то и дело, что нельзя. Этот вопрос уже понимался не раз и далеко не только мной. Устройство класса не позволяет привести указатель на динамическую функцию к указателю на статическую, т.к. указатель динамической функции не будет содержать прямой адрес. То, что она там возвращает не интересно вовсе. Ничто не мешает определить функцию типа void. mr.DUDA, я и имет в виду обычную функцию, можно также и static, а еще лучше friend. Механизм ты описал абсолютно точно. Это сообщение отредактировал(а) ??? - 22.3.2004, 17:27 |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
помнится, где-то тут обсуждалось то, что все функции класса при компиляции представляются в виде обычных функций, у которых есть дополнительный элемент - указатель на экземпляр для которого они вызываются
именно такой вид имеет функция потока:
может, попробовать как-то преобразовать функцию от одного представления к другому... -------------------- qqq |
|||
|
||||
| ??? |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.3.2004 Репутация: нет Всего: нет |
Да вот в том-то и проблема, что не получается. И нигде не могу найти ответа... Такая штука как: DWORD WINAPI (NewClass::*MethodLocator) (LPVOID); MethodLocator = &NewClass::SomeMethod; LPTHREAD_START_ROUTINE Thread = (LPTHREAD_START_ROUTINE) MethodLocator; не проходит. Can't cast from Class::*Method to *Method. Хрен его знает как это должно быть. Нигде нет ответа. Может быть, что я чего-то не понимаю или не так делаю или не вник до конца. Хотя, собственно, это и не важно для thread'а. Спасибо. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |