![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Про потоки [D7]
<Lelik> © (2005-06-14 16:41:00)Здравствуйте, программеры!
Вот такой вопрос:
Есть форма, на ней несколько фреймов.
Из доп. потока необходимо с пом. SendMessage менять содержимое фреймов. Т.е. например добавить в ComboBox фрейма значение из Msg. Но че-то не идет. Передаю в доп. поток Handle глав. формы.
Затем в процедуре доп. потока выполняющейся в Synchronize, посылаю сообщение. В модуле главной формы создал процедуру AppMessage, кот. должна обрабатывать нужные сообщения. Но до туда даже не доходит. Может с фреймами ка-то по особому работают?
<Lelik> (2005-06-14 18:17:00) [1]2 Digitman ©
> что "не пошло" ?
Я изначально процедуры обработки сообщений запихнул в описания фреймов. Там они не отрабатывались. А надо было в описание формы :)
Да с PostMessage все заработало. А вот с Send'ом onMessage не работает. Все по help'у :)
Про Synchronize - c ним работает. Буду убирать наверно, тока придется списки сделать потокозащищенные.
-=XP=- (2005-06-14 17:56:00) [2]Ну тогда осталось дело за малым.
Убрать Synchronize
[11] + PostMessage(Application.Handle, ...)
И отчет о результатах. :)
Digitman (2005-06-14 17:49:00) [3]
> <Lelik> (14.06.05 17:45) [13]
> Так изначально не пошло
что"не пошло" ?
> -=XP=- © (14.06.05 17:46) [14]
> если автору так хочется через Synchronize - так хоть и
> напрямую к объекту через Dispatch().
строго наоборот - НЕ хочется ему "через Synchronize"
и "напрямую к объекту через Dispatch()" тоже нельзя - на кой ляд тогда, спрашивается, вести речь о синхронизации ?
Eraser (2005-06-14 17:49:00) [4]<Lelik> (14.06.05 17:40) [12]
1. Отправляй ф-ей PostMessage, если хочешь обрабатывать сообщение через AppMessage (подозреваю что это Application.OnMessage).
2. Убери Synchronize.
-=XP=- (2005-06-14 17:46:00) [5]посланное ОТКУДА УГОДНО окну ДАННОГО экземпляра формы класса TMainForm
А если автору так хочется через Synchronize - так хоть и напрямую к объекту через Dispatch().
P.S. Какое месиво! Эх! :o)
<Lelik> (2005-06-14 17:45:00) [6]2 Digitman ©
>я вообще не вижу явного резона в обрабортке Application.OnMessage()
Так изначально не пошло
<Lelik> (2005-06-14 17:40:00) [7]2 Eraser ©
Отправляю Send'ом
2 -=XP=- ©
Да, то что метод Synchronize выполняется в основном потоке я знаю <Lelik> (14.06.05 17:13) [5] :)
2 Digitman ©
в MainForm.Create
Digitman (2005-06-14 17:38:00) [8]
> Есть форма, на ней несколько фреймов
я вообще не вижу явного резона в обрабортке Application.OnMessage()
TMainForm = class(..)
..
procedure MyMessage(var Message: TMessage); message MYMSG_MYMESSAGE;
..
end;
procedure TMainForm.MyMessage(var Message: TMessage);
begin
..//обрабатываем сообщение MYMSG_MYMESSAGE, посланное ОТКУДА УГОДНО окну ДАННОГО экземпляра формы класса TMainForm
end;
Digitman (2005-06-14 17:30:00) [9]
> <Lelik> (14.06.05 17:22) [7]
> procedure TMainForm.AppMessage(var Msg: TMsg; var Handled:
> Boolean);
а где и когда у тебя вызывается
Application.OnMessage := MainFor.AppMessage
?
-=XP=- (2005-06-14 17:25:00) [10]procedure TMainForm.AppMessage(var Msg: TMsg; var Handled: Boolean);
Выбросить Synchronize и перестать называть метод процедурой.
Eraser (2005-06-14 17:23:00) [11]<Lelik> (14.06.05 17:22) [7]
А отправляешь сообщения случаем не SendMessage'м?
<Lelik> (2005-06-14 17:22:00) [12]2 Digitman ©
>показывай
procedure TMainForm.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
case Msg.message of
... и т.д. обращение к процедурам фреймов
Мне главное чтоб в модуле доп. потока не было прямого обращения к контролам.
Digitman (2005-06-14 17:18:00) [13]
> В модуле главной формы создал процедуру AppMessage, кот.
> должна обрабатывать нужные сообщения
показывай
<Lelik> (2005-06-14 17:13:00) [14]Да, то что метод Synchronize выполняется в основном потоке я знаю. И то, что Handle вроде как излишний. Но мне надо именно, чтоб именно через сообщения, а не напрямую имена Form1.Frame1.ComboBox1.
Eraser (2005-06-14 17:01:00) [15]<Lelik> (14.06.05 16:55) [2]
Так как используют сообщения для передачи данных именно попричине того, чтобы НЕ использовать Synchronize, который потребляет сравнительно много ресурсов и теоретически может свести на "нет" многопоточность вашего приложения.
Из синхронизируемого метода можно обращаться напрямую к полям формы, как и в обычном приложении.
Если использовать сообщения, то никакие Synchronize не нужны.
Читать http://www.podgoretsky.com/ftp/Docs/Classics/Richter/richter4ru.zip
-=XP=- (2005-06-14 16:58:00) [16]Why?
Патамушта. Зачем Вам Send/Post Message, если используется Synchronize?
"Купил билет, пошел пешком - назло кондуктору!" (С)
Ась?
<Lelik> (2005-06-14 16:55:00) [17]2 Eraser ©
Why?
Eraser (2005-06-14 16:43:00) [18]<Lelik> (14.06.05 16:41)
Затем в процедуре доп. потока выполняющейся в Synchronize, посылаю сообщение
Вся система сообщений насмарку!