Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические потоки. 
:(
    Опции темы
???
Дата 20.3.2004, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Необходимо динамически создавать потоки (CreateThread), указывая как основную функцию некую функцию класса. Т.е. сначала создается объект, затем создается поток, которому назначается некоторая функция этого объекта. Каким образом можно реализовать это, и вообще какие подходы можно определить? Спасибо.
PM MAIL   Вверх
bilbobagginz
Дата 20.3.2004, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


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

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



стоит во первых ознакомиться с потоковыми методами програмирования
(примеры "покупки молока" и примеры "производителя и потребителя", в общем проблемы "критического участка" кода, когда важно обеспечить контроль входа в определённый участок кода)
далее стоит почитать MSDN на предмет инструментов данных в виндах для целей поддержки Потоков (class CWinThread, CreateEvent(), и т.д.)
....блин "Потоки" smile.gif ни разу на русском не слышал этого термина!

а дальше пойдёт как по маслу.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
???
Дата 20.3.2004, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bilbobagginz @ 20.3.2004, 22:23)
стоит во первых ознакомиться с потоковыми методами програмирования
(примеры "покупки молока" и примеры "производителя и потребителя", в общем проблемы "критического участка" кода, когда важно обеспечить контроль входа в определённый участок кода)
далее стоит почитать MSDN на предмет инструментов данных в виндах для целей поддержки Потоков (class CWinThread, CreateEvent(), и т.д.)
....блин "Потоки" smile.gif ни разу на русском не слышал этого термина!

а дальше пойдёт как по маслу.

Значит, мало слышал. Треды, нити, потоки - в принципе, проблема названий к теме имеет отношение малое. MFC оставим в стороне, а также и проблемы синхронизации. Собственно, вопрос состоял в том, а можно ли каким-либо способом динамическую функцию объекта привести к виду LPTHREAD_START_ROUTINE. Вообще-то, для потока это вовсе не обязательно: можно использовать и статическую функцию, передав в параметре потоку указатель на объект, т.е. явная передача this. Меня интересовала в принципе возможность указания динамической функции и не более... В теории, это невозможно, ну, мне так кажется. Ладно, тема исчерпана, извините и спасибо за внимание.
PM MAIL   Вверх
mr.DUDA
Дата 21.3.2004, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



2 ???
можно и без статической функции, используя указатель на метод объекта (см. FAQ), но через глобальную функцию. То есть, поток реально создаётся на глобальную ф-цию, в которую через LPVOID передаётся пара значений "указатель на объект" / "указатель на метод", и далее глоб. функция вызывает метод по указателю. Хоть данный метод и кажется замороченным, но в реальности получается что можно создать поток на любой метод любого класса (можно даже написать специальный шаблон функции, который будет принимать указатель на объект и указатель на метод, и создавать поток).




--------------------
user posted image
PM MAIL WWW   Вверх
bilbobagginz
Дата 21.3.2004, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


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

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



Дорогой "???" можно использовать любую функцию к которой у тебя есть доступ из "this", но принято, что эта функция - возвращает void. a динамическая она или нет - дело твоё.





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
???
Дата 22.3.2004, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bilbobagginz @ 21.3.2004, 09:23)
Дорогой "???" можно использовать любую функцию к которой у тебя есть доступ из "this", но принято, что эта функция - возвращает void. a динамическая она или нет - дело твоё.

bilbobagginz, в том-то и дело, что нельзя. Этот вопрос уже понимался не раз и далеко не только мной. Устройство класса не позволяет привести указатель на динамическую функцию к указателю на статическую, т.к. указатель динамической функции не будет содержать прямой адрес. То, что она там возвращает не интересно вовсе. Ничто не мешает определить функцию типа void. mr.DUDA, я и имет в виду обычную функцию, можно также и static, а еще лучше friend. Механизм ты описал абсолютно точно.

Это сообщение отредактировал(а) ??? - 22.3.2004, 17:27
PM MAIL   Вверх
maxim1000
Дата 22.3.2004, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



помнится, где-то тут обсуждалось то, что все функции класса при компиляции представляются в виде обычных функций, у которых есть дополнительный элемент - указатель на экземпляр для которого они вызываются
именно такой вид имеет функция потока:
Цитата
DWORD WINAPI ThreadProc(
  LPVOID lpParameter  // thread data
);
(MSDN)
может, попробовать как-то преобразовать функцию от одного представления к другому...


--------------------
qqq
PM WWW   Вверх
???
Дата 22.3.2004, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(maxim1000 @ 22.3.2004, 18:52)
помнится, где-то тут обсуждалось то, что все функции класса при компиляции представляются в виде обычных функций, у которых есть дополнительный элемент - указатель на экземпляр для которого они вызываются
именно такой вид имеет функция потока:
Цитата
DWORD WINAPI ThreadProc(
  LPVOID lpParameter   // thread data
);
(MSDN)
может, попробовать как-то преобразовать функцию от одного представления к другому...

Да вот в том-то и проблема, что не получается. И нигде не могу найти ответа... Такая штука как:

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'а. Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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