Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Динамические потоки.


Автор: ??? 20.3.2004, 21:31
Необходимо динамически создавать потоки (CreateThread), указывая как основную функцию некую функцию класса. Т.е. сначала создается объект, затем создается поток, которому назначается некоторая функция этого объекта. Каким образом можно реализовать это, и вообще какие подходы можно определить? Спасибо.

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

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

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

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

Значит, мало слышал. Треды, нити, потоки - в принципе, проблема названий к теме имеет отношение малое. MFC оставим в стороне, а также и проблемы синхронизации. Собственно, вопрос состоял в том, а можно ли каким-либо способом динамическую функцию объекта привести к виду LPTHREAD_START_ROUTINE. Вообще-то, для потока это вовсе не обязательно: можно использовать и статическую функцию, передав в параметре потоку указатель на объект, т.е. явная передача this. Меня интересовала в принципе возможность указания динамической функции и не более... В теории, это невозможно, ну, мне так кажется. Ладно, тема исчерпана, извините и спасибо за внимание.

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


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



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

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

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

Автор: ??? 22.3.2004, 19:26
Цитата(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'а. Спасибо.

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