Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передать данные объекту, из TThead в TObject 
:(
    Опции темы
Albinos_x
Дата 12.5.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Доброе время суток.

есть задача:
Есть объект от Tobject и поток (TThead). В потоке я отслеживаю состояние устройства, при изменении этого состояния я должен послать на объект (TObject) сообщение с информацией на порту. Вопрос возник в следствии того что класс Tobject не имеет хендл, а если посылать сообщение через sendmessage, то необходимо указать hwnd адресата.


вопрос: как получить/создать хендл для своего объекта? 
или, если есть, другие предложения по передаче данных объекту из потока (глобальные переменные не подходят, т.к. объектов может быть несколько). 

Заранее спасибо.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 12.5.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Albinos_x @  12.5.2010,  15:08 Найти цитируемый пост)
. Вопрос возник в следствии того что класс Tobject не имеет хендл, а если посылать сообщение через sendmessage, то необходимо указать hwnd адресата.

Можно попробовать использовать встроенный механизм делфи
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 вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 12.5.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



да... нашел упоминание об этом методе в королевстве делфи... но пока до конца не догнал, как правильно его использовать...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 13.5.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Albinos_x @  12.5.2010,  22:30 Найти цитируемый пост)
но пока до конца не догнал, как правильно его использовать... 

Вот пример
Код

type
  MyObj = class
    public
      procedure WMInitMenuPopup(var Message: TMessage); message WM_COMMAND;
  end;

procedure MyObj.WMInitMenuPopup(var Message: TMessage);
begin
  ShowMessage(PWideChar(Message.WParam));
  Message.Result := 1;
end;


procedure TForm1.FormCreate(Sender: TObject);
const
  msg : String = 'хелло ворд';
var
  obj : MyObj;
  m   : TMessage;
begin
  obj := MyObj.Create;
    m.Msg    := WM_COMMAND;
    m.WParam := Integer(PWideChar(msg));
    obj.Dispatch(m);
    ShowMessage('результат ' + IntToStr(m.Result));
  obj.Free;
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 13.5.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Спасибо большое за пример.

ещё вопрос в продолжение темы... из примера следует, что мне нужно передать объект в поток.... а если я поток создам внутри объекта, ну, например, так:
Код

type
  TMythead = class(TThead)
    public
       Data1:...
       ...
       DataN:...
       Constructor Create(...);
       procedure execute;...
     end;

  TMyObj = class(TObject)
    public
       Data1:...
       ...
       DataN:...
       DataN1: MyThead
       procedure RecerveMessege(...);
     end;


как тогда в этом случае лучше поступить? если бы был хендл, то его можно было бы передать в конструктор потока, в этом случае, конечно, можно передать pointer объекта, но думаю, что это не самый лучший вариант... можно передать, также и переменную из объекта в поток, которую и изменять, но в этом случае нужно будет ещё заморачиваться с критическими секциями или мютексами, что не очень хотелось бы....

Добавлено через 5 минут и 16 секунд
если кому то будет интересно, ещё один пример с Dispatch


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 13.5.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Albinos_x @  13.5.2010,  15:42 Найти цитируемый пост)
из примера следует, что мне нужно передать объект в поток....

  Если вспомнить, что в делфи объект это указатель, то ничего страшного. Присваивание объектов это не операция копирования, а лишь присваивание указателей. Обычная атомарная операция, которая не требует синхронизации. Переменная объекта это лишь 4 байта указателя.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 14.5.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(Alexeis @  13.5.2010,  18:19 Найти цитируемый пост)
Присваивание объектов это не операция копирования, а лишь присваивание указателей.

это то понятно... я про то, что хотелось бы избежать циклических ссылок...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 14.5.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Albinos_x @  14.5.2010,  08:06 Найти цитируемый пост)
это то понятно... я про то, что хотелось бы избежать циклических ссылок... 

  В модулях? Так приводи наследника к TObject. Источнику сообщения достаточно знать, что это TObject, кто будет наследником не важно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 14.5.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



т.е. подразумеваешь деать так:
Код

type
  TMythead = class(TThead)
    public
       Data1:...
       ...
       DataN:...
       Constructor Create(Obj:TObj...);
       procedure execute;...
     end;

  TMyObj = class(TObject)
    public
       Data1:...
       ...
       DataN:...
       DataN1: MyThead
       procedure RecerveMessege(...);
     end;

......
var myobj:MyObj;

....
myobj.dataN1:=TMythead.Create((myobj as TObject),....) // или что-то подобное...
...


Добавлено через 24 секунды
я правильно понял?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 14.5.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Albinos_x @  14.5.2010,  12:31 Найти цитируемый пост)
я правильно понял? 

  Да, я это имел ввиду. Вот только меня терзают сомнения в потокобезопасности.  Не получиться ли так, что вызов обработчика будет в контексте потока вызвавшего Dispatch. Дело в том, что виндовый SendMessage/PostMessage всегда запускает обработку в контексте потока который создал окно. Нужно попробовать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 14.5.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Да уж... Ввел тебя в заблуждение. Обработчик вызывается в контексте вызвавшего потока, так что синхронизация таким способом работать не будет.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Albinos_x
Дата 14.5.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



хорошо... попробую... тогда отпишусь, что из этого вышло)

спасибо)


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




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


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

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