Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Про потоки   Найти похожие ветки 

 
<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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.037 c
1-1118494263
Pasha L
2005-06-11 16:51
2005.07.11
FILETIME


14-1118606205
Andryk
2005-06-12 23:56
2005.07.11
А вот интересно песенка крокодила гены


1-1119590345
Earth
2005-06-24 09:19
2005.07.11
CD


6-1112873558
Opilki_Inside
2005-04-07 15:32
2005.07.11
Выскакивающие окна iexplorera


1-1118420101
Pav
2005-06-10 20:15
2005.07.11
Работа с файлами в Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский