Главная страница
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.48 MB
Время: 0.023 c
6-42522
Polevi
2001-10-17 11:45
2002.01.14
С мольбой о помощи взываю!!!


4-42617
Art
2001-10-31 13:19
2002.01.14
Как можно увидеть запущен ли exe?


1-42436
Yakudza
2001-12-24 15:02
2002.01.14
Редактор SQL запросов.


1-42407
Dmitry_O
2001-12-23 19:49
2002.01.14
изменение языка


3-42368
andey
2001-12-11 19:49
2002.01.14
Изменение записей таблицы исходя из другой