Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.025 c
1-1189061309
tomkat
2007-09-06 10:48
2007.11.25
Переменные в Fastreport 3


2-1193827989
F@T@L_Err0r
2007-10-31 13:53
2007.11.25
Скопировать папку


2-1194116561
timekiller
2007-11-03 22:02
2007.11.25
Добраться до компонента перебором Components


8-1169983919
T54
2007-01-28 14:31
2007.11.25
Количество точек на дюйм - ?


11-1178249686
Infarkt
2007-05-04 07:34
2007.11.25
VCL вместе с KOL




   Наверх