Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.033 c