Потоки, классы и методы

Sep 21, 2009 12:16


В данном опусе речь пойдет о создании потоков. Но не о простом создании, а о более-менее сложных случаях, когда в контексте потока должен выполняться метод некоторого класса, естественно, при условии, что поток создается этим же классом.( Read more... )

Программирование, работа

Leave a comment

Спасибо nut_pro November 3 2011, 20:30:59 UTC
как раз подобный _voodoo_thunk мне понадобится в понедельник для callback'а

Reply

Re: Спасибо nut_pro November 8 2011, 10:51:38 UTC
Хотя, я ошибся
вариант _voodoo_thunk особо ничем не отличается от вариантов со статическими методами, просто в _voodoo_thunk этот метод завуалирован, и у разных экземпляров класса CVoodoo эта функция (которая потом передается в CreateThread) будет одна и та же

Reply

Re: Спасибо shiftmaster November 8 2011, 20:25:11 UTC
Отличается. Тем, что нет функции-переходника. Ее функционал скрыт в шаблоне. Для каждого экземпляра класса будет вызван "свой" метод _DoProc, работающий в другом потоке. В этом легко убедиться, проверив this сразу после входа в _DoProc, например, посредством atltrace или банальным OutputDebugString.
Да, и еще. Для callback'ов такая схема не годится.
Так может быть, дело не в "кошках"? :)

Reply

Re: Спасибо nut_pro November 9 2011, 05:22:40 UTC
_DoProc конечно же вызывается тот, который нужно, но это только потому, что поток запускается сразу при вызове CreateThread. А вы попробуйте создать два потока CREATE_SUSPENDED, а потом оба запустить и увидите, что _DoProc стал одинаковым, а именно последним

Reply

Re: Спасибо shiftmaster November 9 2011, 08:10:07 UTC
Нет, это не так. Вот цитата из Студийного output ( ... )

Reply

Re: Спасибо nut_pro November 9 2011, 10:12:34 UTC
да, забыл, что вы передаете this как параметр в CreateThread и по нему вызываете _DoProc
т.е. _DoProc вызываются разные
но в CreateThread передается одна и та же функция в качестве параметра ThreadProc, т.е. есть статическая функция, хоть она и не указана в описании класса

Reply

Re: Спасибо shiftmaster November 9 2011, 10:38:06 UTC
Да нет же! :) Как могут вызываться методы класса, которые не объявлены? Вызывается именно метод класса, причем не статический, в этом и "фишка" этого шаблона. Больше он ничего не делает, просто скрывает ненужную обвязку в виде статических функций и функций-переходников.

Reply

Re: Спасибо nut_pro November 9 2011, 11:25:14 UTC
я ничего не говорил о том, что вызываются методы, которые не объявлены
просто есть функция, которую скрывает ваш шаблон
хоть она не объявлена как член класса, но она есть и она одна для всех экземпляров класса

Спасибо за хороший пример кода
но жаль оно мне помогло в текущей задаче

Reply

Re: Спасибо shiftmaster November 9 2011, 12:34:39 UTC
Поймите одну главную вещь, при использовании шаблона-переходника статической функции НЕТ. :) Просто нет. В этом и прелесть этого кода. Он легкий, простой и не вносит лишних сущностей в код в виде статических функций.
Интереса ради, посмотрите на ассемблерный код, который генерирует компилятор из этого примера и увидите, что никакими статическими функциями там и не пахнет.
А что за задача?

Reply

Re: Спасибо nut_pro November 9 2011, 13:37:41 UTC
а что там может быть в коде?
ведь в CreateThread должен передаваться указатель на функцию

а я хотел сделать компоненты для DDE и хотел избавиться от статических callback, но пришел к выводу, что это (избавление) "почти" невозможно
оставил статический

Reply

Re: Спасибо shiftmaster November 12 2011, 07:27:26 UTC
Именно он и передается. Гляньте ассемблерный код в отладчике. Суть в том, что, как я писал в самом начале поста, адреса методов всех классов фиксированы, определяются либо при линковке, либо при загрузке исполняемого образа. Шаблон же просто устраняет необходимость в статической функции и облагораживает код.

Reply

Re: Спасибо shiftmaster November 12 2011, 07:28:27 UTC
А вот от статических callback'ов избавится невозможно.

Reply


Leave a comment

Up