Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

synchronize...


istok ©   (2007-09-07 16:42:00) 

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

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

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

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

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


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


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

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

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;


oxffff   (2007-09-08 16:20:00) [2]


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


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


tesseract   (2007-09-08 12:55:00) [3]

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


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

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

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


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


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


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


oxffff   (2007-09-07 20:03:00) [6]

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

?


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


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


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

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


DVM   (2007-09-07 19:12:00) [8]


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

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

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


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


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

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


DVM   (2007-09-07 19:02:00) [10]


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

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


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


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

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

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

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

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


DVM   (2007-09-07 18:48:00) [12]


> istok  

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


DVM   (2007-09-07 18:46:00) [13]


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

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


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

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


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

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


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

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

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


DVM   (2007-09-07 18:09:00) [15]


> istok   (07.09.07 17:41) [2]

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


Palladin   (2007-09-07 17:43:00) [16]

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


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

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

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

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


Palladin   (2007-09-07 17:37:00) [18]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо