![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 для них использовать совершенно не обязательно