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

Вниз

synchronize...   Найти похожие ветки 

 
istok   (2007-09-07 16:42) [0]

есть приложение с ui, которое использует потоки.

потоки используют synchronize чтоб сгенерить событие, главный поток его обрабатывает.

если какая-то форма открыта модально, то иногда событие добирается до главного потока после её закрытия.

а иногда обрабатывается сразу.

как сделать так, чтоб ситуация была управляемой и предсказуемой (кроме как отказаться получать события при открытых модальных формах) ?


 
Palladin ©   (2007-09-07 17:37) [1]

что есть "сгенерить событие"? если post/send message, то synchronize для них использовать совершенно не обязательно


 
istok   (2007-09-07 17:41) [2]

"сгенерить событие" есть вызов процедуры объектоного типа, например такой как TNotifyEvent..

делается оно естественно через synchronize.

post/send message как механизм генерации событий явно не применяется.


 
Palladin ©   (2007-09-07 17:43) [3]

а вот я бы очень посоветовал это применять


 
DVM ©   (2007-09-07 18:09) [4]


> istok   (07.09.07 17:41) [2]

Используй сообщения.


 
istok   (2007-09-07 18:35) [5]

я в параметрах события передаю объекты всякие и очень не хочу извращаться с мессагами, если для этого есть events в delphi.

То есть получается, что это косяк delphi и он неизлечим?


 
DVM ©   (2007-09-07 18:46) [6]


> я в параметрах события передаю объекты всякие и очень не
> хочу извращаться с мессагами

Кто тебе мешает передать указатель на объект с сообщением? Там никаких извращений нет - вся оконная подсистема на этом построена.


> если для этого есть events в delphi.

Они есть в Windows, как и сообщения, а не Delphi.


> То есть получается, что это косяк delphi и он неизлечим?

Тут нет косяка, есть некоторое непонимание происходящего к сожалению.


 
DVM ©   (2007-09-07 18:48) [7]


> istok  

Кстати, в более ранних версиях Delphi работа Synchronize была построена именно на посылке сообщения.


 
istok   (2007-09-07 18:55) [8]


> DVM ©   (07.09.07 18:46) [6]

да, согласен с непониманием, я вспомнил про виндовские эвенты...

просто не имею практики с ними и не хочется менять эвенты из-за одного косяка с showmodal...

насчет извращений - просто я хочу решить задачу в рамках технологий, которые привык использовать.

смена технологии всегда покажет новые косяки и уйдет время на стабилизацию (косяки не технологии, а её использования..). гладко ничего не бывает...


 
DVM ©   (2007-09-07 19:02) [9]


> просто не имею практики с ними и не хочется менять эвенты
> из-за одного косяка с showmodal...

Так ты что используешь Events или Synchronize я что то не пойму?


 
istok   (2007-09-07 19:10) [10]


> DVM ©   (07.09.07 19:02) [9]

вызов TMyEvent = procedure...of object через Synchronize


 
DVM ©   (2007-09-07 19:12) [11]


> вызов TMyEvent = procedure...of object через Synchronize

Аааа.. Ты вот про какие эвенты.

Ну, во вобщем, мой выбор - сообщения. Это очень просто в реализации и очень удобно. Тебе решать.


 
istok   (2007-09-07 19:18) [12]


> Ну, во вобщем, мой выбор - сообщения. Это очень просто в
> реализации и очень удобно. Тебе решать.


да я-то уже сделал всё через то что описал и не хочется менять, не убедившись что нет более дешевого способа поправить косяки с обработкой события.

есть варианты поправить косяки в рамках событий через Synchronize или нет?


 
oxffff ©   (2007-09-07 20:03) [13]

unit Classes;
function CheckSynchronize(Timeout: Integer = 0): Boolean;

?


 
istok   (2007-09-07 21:36) [14]


> function CheckSynchronize(Timeout: Integer = 0): Boolean;
>  


почитал хелп, не совсем понял..
т.е. вызывать его из основного потока - и он будет ждать синхронайзов от фоновый потоков скока надо ?


 
istok   (2007-09-08 01:06) [15]

попробовал. баг не ушел.

баг вообще очень плавающий, на одних компах почти не ловится, на других иногда ловится..


 
tesseract ©   (2007-09-08 12:55) [16]

Использовать виндовые сообщения и критические секции.


 
oxffff ©   (2007-09-08 16:20) [17]


> istok   (07.09.07 21:36) [14]
>
> > function CheckSynchronize(Timeout: Integer = 0): Boolean;
>
> >  
>
>
> почитал хелп, не совсем понял..
> т.е. вызывать его из основного потока - и он будет ждать
> синхронайзов от фоновый потоков скока надо ?


CheckSynchronize вызывается к главном потоке и немедленно выполняет отложенные вызовы.


 
jack128_   (2007-09-08 21:13) [18]


> если какая-то форма открыта модально, то иногда событие
> добирается до главного потока после её закрытия.

Что то я такого не наблюдаю:

type
 TTestThread = class(TThread)
 private
   procedure ShowMsg;
 protected
   procedure Execute; override;
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TTestThread.Create(False);
 ShowMessage("Привет из кнопки");
end;

{ TTestThread }

procedure TTestThread.Execute;
begin
 FreeOnTerminate := True;
 Sleep(1000); // подождем пока откроется модальное окно
 Synchronize(ShowMsg); // и открываем наше
end;

procedure TTestThread.ShowMsg;
begin
 ShowMessage("Привет из потока");
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.048 c
15-1193249446
Leron
2007-10-24 22:10
2007.11.25
2 подключения + домашняя сеть


6-1174732046
S_T_E_P_A_N___
2007-03-24 13:27
2007.11.25
Динамическое создание компонентов Indy


15-1193395304
Sour Smile
2007-10-26 14:41
2007.11.25
Стандартные заголовочные файлы


11-1163342104
Ned
2006-11-12 17:35
2007.11.25
Отцентровать изображение


15-1192827366
Nic
2007-10-20 00:56
2007.11.25
Какой регистратор лучше для...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский