Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.005 c
7-42587
Andrey
2001-06-20 16:01
2002.01.14
Закрытие консольного приложения


6-42526
leming
2001-10-16 11:03
2002.01.14
Обработка ошибок в Indy


3-42373
dmimikh
2001-12-13 10:48
2002.01.14
Query


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


1-42473
vitaminchik
2001-12-25 12:54
2002.01.14
Хранение данных в файлы





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