Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.14;
Скачать: CL | DM;

Вниз

Коллизии потоков   Найти похожие ветки 

 
Grigory   (2001-12-26 10:09) [0]

Хочу узнать что происходит в таком случае:
поток 1 (главный поток программы) создаёт класс дочерний от TThread :
thread := Tmy_thread.Create;
затем выполняется оператор thread.Resume - запускается метод execute объекта thread в отдельном потоке.
После этого выполняется myForm.ShowModal; - приложение блокируется модальным окном.

В классе Tmy_thread на событие OnTerminate повешан следующий метод в котором закрывается модальное окно:

Выглядит всё это так:

Procedure Form1.onBtnClick (Sender: TObject);
begin
thread := Tmy_thread.Create;
thread.OnTerminate := doTerminateMyThread;
thread.Resume;
myForm.ShowModal;
end;

Procedure Form1.doTerminateMyThread (Sender: TObject);
begin
myForm.Close;
end;

вроде всё верно написано, вот только работает не так как хочется:
1 Окно myForm не закрывается после отработки процесса, пока не двинуть на нём мышкой !!!
2 После закрытия главного окна программы вылетает Exception :
"Win32 error. Code: 1440. Invalid window handle"

ПОЧЕМУ НЕ ЗАКРЫВАЕТСЯ ОКНО???!!!
И ОТКУДА БЕРЁТСЯ EXCEPTION???!!!

многовато получилось текста :)


 
Внук   (2001-12-26 10:27) [1]

Прошу прощения, нет времени совсем. Попробуйте примерно так (даже не компилировал).

TmyThread=class(TThread)
private
f:TForm;
protected
procedure Execute;override;
procedure CloseForm;

Procedure Form1.onBtnClick (Sender: TObject);
var thread:TmyThread;
begin
thread:=Tmy_thread.Create(true);
thread.f:=Self;
thread.Resume;
myForm.ShowModal;
end;

Procedure TMyThread.CloseForm;
begin
f.ModalResult:=mrOk;
end;

Procedure TMyThread.Execute;
begin
while not Terminated do
begin
...
end;
Syncronize(CloseForm);
end;

А вообще, почитайте про синхронизацию потоков.


 
panov   (2001-12-26 10:30) [2]

"thread.OnTerminate := doTerminateMyThread;"
А разве это должно выполняться не в конструкторе потока?


 
troits   (2001-12-26 13:12) [3]

Скорее всего, проблема в неправильно созданной myForm.
Я попробовал сделать аналогичный проект - все работает.

>Внук
Может я ошибаюсь, поправьте, если не так, но OnTerminate и
так вызывается через Synchronize.

>Panov
Почему обязательно в конструкторе? Если TThread создаётся с
CreateSuspended = True, как в данном случае, то все Ok.


 
panov   (2001-12-26 13:35) [4]

>troits © (26.12.01 13:12)
Согласен, ошибся.
OnTerminate должен вызываться в контексте основного потока.


 
Внук   (2001-12-26 14:56) [5]

>>troits ©
Вы правы, я как то не подумал. Но главная моя мысль там была в другом: вызывать Close после ShowModal как-то негуманно, IMHO.
>>Grigory ©
А все же интересно, мой вариант у Вас будет работать?



Страницы: 1 вся ветка

Текущий архив: 2002.01.14;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.004 c
14-42549
Бармен
2001-11-15 16:09
2002.01.14
Народ, а кто каким средством для построения инсталляционных пакетов пользуется?


1-42400
GARIK_PR
2001-12-26 15:07
2002.01.14
Интеграция с математическими пакетами программ.


1-42456
777
2001-12-25 04:10
2002.01.14
Ширина колонок TDBGrid


14-42572
Donal
2001-11-16 17:19
2002.01.14
а вот такой вопрос :-)


1-42513
Aleksey_K
2001-12-25 14:19
2002.01.14
Help !!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский