Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.032 c
14-1118722871
Vlad Oshin
2005-06-14 08:21
2005.07.11
Pomogite s russkimi bukvami


1-1119506247
JetMan
2005-06-23 09:57
2005.07.11
поиск по ListView


3-1116433390
Делфенок
2005-05-18 20:23
2005.07.11
Чтение информации из dbf


14-1118055709
1008
2005-06-06 15:01
2005.07.11
legalize (Украина, госструктуры)


5-1086668430
Gelios
2004-06-08 08:20
2005.07.11
Редактор свойств/компонент а-ла Fields Editor