Главная страница
    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
1-42413
Andrey196
2001-12-26 21:38
2002.01.14
Как фон Labela сделать прозрачным?


14-42565
-=CrazyFish=-
2001-11-15 11:12
2002.01.14
какой процессор лучше?


4-42606
tropin
2001-11-13 20:46
2002.01.14
Как получить переменные среды?


14-42556
AlexKniga
2001-11-19 15:17
2002.01.14
Сброс пароля на BIOS


3-42333
Марина
2001-12-10 11:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский