![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| null56 |
|
||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
Всем привет
Задача: пытаюсь создать метод класса, который бы работал в потоке Метод класса
Вызов №1:
Ок... вызов №2
Приведение типа (хоть оно и нерекомендовано в мсдн) не помогло... вызов №3
Итог: если объявить функцию статичной, компилятор пропускает Вопрос: Неужели низя передать нестатический метод класса в поток??? Заранее благодарен за помощь ЗЫ: вызовы произвожу также из метода этого же класса Добавлено через 11 минут и 43 секунды я могу лишь предположить, что несоответствие происходит из - за неявного параметра this перед именем функции если моё предположение верно, то реально ли передать метод в поток? |
||||||||||||||
|
|||||||||||||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
в соседней теме, смотрю, человек передал через объект через this в статику... похоже, что нельзя
Это сообщение отредактировал(а) null56 - 1.3.2010, 18:41 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
||||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
метод объявляется как stdcall, this - параметр потока разумеется это работает только для тех случаев, когда указатель на метод класса является указателем на код метода класса, т.е. в классе нет виртуальных функций и множественного наследования Добавлено @ 18:58 и разумеется используя этот код надо понимать что ты делаешь, в каких случаях он будет работать, а в каких нет, и как сделать так чтобы он работал в нужном тебе случае. Добавлено @ 18:59 алсо рекомендую таки использовать boost.thread + boost.bind Это сообщение отредактировал(а) GoldFinch - 1.3.2010, 19:03 |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
извиняюсь за дубляж, плохо искал значит
спасибо за помощь |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нет, null56, явно колбеком методы класса передавать нельзя,
т.к. они сильно зависят от конкретных реализаций и класса (как заметил GoldFinch), и компилятора, лучше смотри в сторону azesmcar и X-3R1, это гораздо читабельнее, корректнее и проще Это сообщение отредактировал(а) GremlinProg - 1.3.2010, 19:44 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: нет Всего: 12 |
GremlinProg
я сделал через статику и через this, а параметры передал через сам объект... очень удобно и корректно показалось.... хотя вариант с шаблоном тоже не плохо смотрится.... Вариант GoldFinch интересный, но действительно опасный, выдирать адрес колбека... |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
если туда в самом деле добавить статик_ассерт (например BOOST_STATIC_ASSERT или static_assert в C+0x),
то все будет безопасно, код будет компилиться для тех методов с которыми все будет работать, а для тех методов с которыми этот код работать не будет компилятор выдаст ошибку. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
о_О, чего сказал? -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
|
|||
|
||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
GremlinProg,
я сказал, что единственный источник проблем в предложенном мной коде, это то что не всегда указатель на член класса реализуется как обычный указатель. однако это можно проверить, сравнив размеры указателя на метод и обычного указателя (void*) тот указатель на член класса, который не является обычным указателем, содержит дополнительную информацию, по этому его размер больше, чем размер обычного указателя по этому можно написать
Добавлено @ 21:15 те кто не использует компилятор с поддержкой C++0x могут использовать
Добавлено @ 21:20 впрочем счя проверил этот код на g++ 4.1.2 (codepad.org), он не работает (т.е. срабатывает ассерт). что же, это означает, что тем кто пишет код под Windows на gcc - неповезло. не стоит забывать, что это раздел про Windows, и тема про использование функции WinAPI CreateThread. думаю что подавляющее большинство программистов используют msvc для создания windows-приложений. Это сообщение отредактировал(а) GoldFinch - 1.3.2010, 21:27 |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, если бы мы разбирали конкретную реализацию компилятора, например как у Delphi, то да, могло бы прокатить, только у Delphi нет таких богатых инструментов compile-time, чтобы такое там можно было использовать, так что - нет, это не вариант для си/си++ Добавлено через 3 минуты и 50 секунд си просто не хранит this рядом с указателем на метод принципиально -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
GremlinProg, говоря о винде, мы скорее всего говорим о MSVC.
хотя конечно есть Borland C++ и есть Intel C++ compiler, и есть Clang (o_O) и много чего еще. разумеется этот код может не работать ни на чем кроме MSVC. однако это не повод не использовать этот код тем кто всегда юзает MSVC в любом случае - имхо лучшее решение это boost.thread Добавлено @ 21:28
не понял. this передается в метод отдельно, как 1й аргумент функции потока, потому что там указано что метод использует stdcall Это сообщение отредактировал(а) GoldFinch - 1.3.2010, 21:29 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ничего не имею против g++, delphi и borland в целом, я просто говорю, что для си, как такового, это решение не подходит, т.к. си принципиально не хранит ни каких дополнительных данных рядом с указателями, даже теми, которые выступают в роли членов класса -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
GremlinProg, помоему тема катится непонятно куда, пора бы заканчивать.
есть стандарт С++, в нем написано что указатель на член класса - это не обычный указатель и его представление в памяти зависит от реализации.
также известно, как именно реализованы указатели на функции-члены классов в MSVC: за исключением особых случаев, это обычные указатели, которые можно преобразовывать в другие указатели Это сообщение отредактировал(а) GoldFinch - 1.3.2010, 21:55 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |