Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
11-1178249686
Infarkt
2007-05-04 07:34
2007.11.25
VCL вместе с KOL


2-1193815331
СержК
2007-10-31 10:22
2007.11.25
Как "равернуть" грид (что-то типа Orientation=Horizontal)


2-1194269229
Свой
2007-11-05 16:27
2007.11.25
Как загрузить файл из интернета


2-1193841083
Tonich
2007-10-31 17:31
2007.11.25
Фильтр


15-1193027871
Slider007
2007-10-22 08:37
2007.11.25
С днем рождения ! 22 октября 2007 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский