![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
Доброе время суток.
есть задача: Есть объект от Tobject и поток (TThead). В потоке я отслеживаю состояние устройства, при изменении этого состояния я должен послать на объект (TObject) сообщение с информацией на порту. Вопрос возник в следствии того что класс Tobject не имеет хендл, а если посылать сообщение через sendmessage, то необходимо указать hwnd адресата. вопрос: как получить/создать хендл для своего объекта? или, если есть, другие предложения по передаче данных объекту из потока (глобальные переменные не подходят, т.к. объектов может быть несколько). Заранее спасибо. -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Можно попробовать использовать встроенный механизм делфи http://docwiki.embarcadero.com/VCL/en/Syst...Object.Dispatch Любой наследник TObject может передавать управление своим обработчикам сообщений разбирая сообщение в методе Dispatch. Т.е. в качестве дескриптора указатель на объект. В Dispatch можешь передавать сообщение в формате TMessage. Хэнл не имеет значения. Так работает обработка сообщений у не оконных наследников TComponent. Она построена на механизме реализованном еще в TObject . Можешь даже перегрузить функцию SendMessage в виде SendMessage (obj : TObject; Message : integer; wparam : integer; lparam : integer) : integer; -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
да... нашел упоминание об этом методе в королевстве делфи... но пока до конца не догнал, как правильно его использовать...
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Вот пример
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
Спасибо большое за пример.
ещё вопрос в продолжение темы... из примера следует, что мне нужно передать объект в поток.... а если я поток создам внутри объекта, ну, например, так:
как тогда в этом случае лучше поступить? если бы был хендл, то его можно было бы передать в конструктор потока, в этом случае, конечно, можно передать pointer объекта, но думаю, что это не самый лучший вариант... можно передать, также и переменную из объекта в поток, которую и изменять, но в этом случае нужно будет ещё заморачиваться с критическими секциями или мютексами, что не очень хотелось бы.... Добавлено через 5 минут и 16 секунд если кому то будет интересно, ещё один пример с Dispatch -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Если вспомнить, что в делфи объект это указатель, то ничего страшного. Присваивание объектов это не операция копирования, а лишь присваивание указателей. Обычная атомарная операция, которая не требует синхронизации. Переменная объекта это лишь 4 байта указателя. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
это то понятно... я про то, что хотелось бы избежать циклических ссылок... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
В модулях? Так приводи наследника к TObject. Источнику сообщения достаточно знать, что это TObject, кто будет наследником не важно. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
т.е. подразумеваешь деать так:
Добавлено через 24 секунды я правильно понял? -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Да, я это имел ввиду. Вот только меня терзают сомнения в потокобезопасности. Не получиться ли так, что вызов обработчика будет в контексте потока вызвавшего Dispatch. Дело в том, что виндовый SendMessage/PostMessage всегда запускает обработку в контексте потока который создал окно. Нужно попробовать. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Да уж... Ввел тебя в заблуждение. Обработчик вызывается в контексте вызвавшего потока, так что синхронизация таким способом работать не будет.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
хорошо... попробую... тогда отпишусь, что из этого вышло)
спасибо) -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |