Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.25;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
15-1193073294
БарЛог
2007-10-22 21:14
2007.11.25
В проигрывателе не играются некоторые DVD-диски


15-1192980859
Kostafey
2007-10-21 19:34
2007.11.25
Использование JBuilder для разработки JSF


15-1193341207
@!!ex
2007-10-25 23:40
2007.11.25
Объясните?


2-1193997864
Новичек
2007-11-02 13:04
2007.11.25
Функция WaitFor в Indy.


15-1193231407
Pweq
2007-10-24 17:10
2007.11.25
Как вычислить arccos через arctan?