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