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

Вниз

TThread   Найти похожие ветки 

 
злобная танька   (2005-08-08 21:04) [0]

Привет!
в общем ситуация такая: есть просто окно винапишное, оно при создании запускает поток, который должен кое-что выполнить а потом закрыть это окно. Для окна сохраняется хэндл WND. Вот так создаю поток:

 T2 := TThread2.Create(true);
 T2.FreeOnTerminate := true;
 T2.Resume;

Вот деструктор потока:
 destructor TThread2.Destroy;
 begin
   inherited;
   PostMessage(WND, WM_CLOSE, 0, 0);
 end;

Программа ругается. Пишет, что "Thread Error: Неверный дескриптор (6)". Что не так?? что с дескриптором?

да, потом ещё Runtime Error 216 показывает.


 
Defunct ©   (2005-08-08 21:10) [1]

злобная танька   (08.08.05 21:04)  

для начала поместить PostMessage в тело Execute (последней строчкой).


 
Eraser ©   (2005-08-08 21:17) [2]

злобная танька   (08.08.05 21:04)

Делов том, что данный деструктор выполняется в контексте главного потока приложения.


 
злобная танька   (2005-08-08 21:52) [3]

спасибо вам, работать стало лучше, но всё равно как-то не очень :)

иногда при закрытии возникает ошибка "Приложение будет закрыто. Приносим извинения за неудобства". я в принципе и не против того, чтобы оно было закрыто, но реакция виндовса какая-то странная.. отчего это может быть?

там в Execute второго потока цикл:

Repeat
...
Until ExitFlag;
PostMessage(.....

Внутри цикла может возникнуть ситуация, что он завершится, и тогда будет отправлено WM_CLOSE в главный поток..
а есть второй способ выхода - по Alt+F4. Второй способ работает всегда без ошибок, а первый иногда выдаёт это.. "Приложение будет закрыто". бывает редко, но всё равно неприятно :(

подскажите, из-за чего это м.б.?


 
Eraser ©   (2005-08-08 22:46) [4]

злобная танька   (08.08.05 21:52) [3]
Until ExitFlag;


Попробуй примерно так
Until ExitFlag and Terminated;


 
evvcom ©   (2005-08-09 08:33) [5]

А ExitFlag зачем? Достаточно Terminated.
> подскажите, из-за чего это м.б.?

Из-за ошибки в программе. Скорее всего в 17-й строке. Да, да, именно в 17-й...


 
BiN ©   (2005-08-09 09:11) [6]

destructor TThread2.Destroy;
begin
  inherited;
  PostMessage(WND, WM_CLOSE, 0, 0);
end;

замени на
destructor TThread2.Destroy;
begin
  PostMessage(WND, WM_CLOSE, 0, 0);
  inherited;
end;


 
evvcom ©   (2005-08-09 09:34) [7]


> BiN ©   (09.08.05 09:11) [6]

А разница какая?


 
Leonid Troyanovsky ©   (2005-08-09 09:42) [8]


> evvcom ©   (09.08.05 09:34) [7]
>
> > BiN ©   (09.08.05 09:11) [6]
>
> А разница какая?


Видимо, WND поле класса TThread2.

--
Regards, LVT.


 
злобная танька   (2005-08-09 11:38) [9]

> Leonid Troyanovsky ©   (09.08.05 09:42) [8]
не, WND это не поле TThread2. это глобальная переменная.

ps: сейчас всё отлично работает, наверное вчера виндовс глючил немного или что-то такое :)

только вот это "деструктор выполняется в контексте главного потока приложения" всё равно не понятно. не подскажите линк на что-то всеобъемлющее по потокам? :)


 
Mx ©   (2005-08-09 12:25) [10]


> злобная танька   (09.08.05 11:38) [9]
> ps: сейчас всё отлично работает, наверное вчера виндовс
> глючил немного или что-то такое

Такие заявления чреваты будущими ошибками. Советую еще все раз по десять прогнать. Скорее всего проблема не решена, а просто ошибка ввиду каких-то временных условий не возникает.


 
Leonid Troyanovsky ©   (2005-08-09 13:08) [11]


> злобная танька   (09.08.05 11:38) [9]

> только вот это "деструктор выполняется в контексте главного
> потока приложения" всё равно не понятно. не подскажите линк
> на что-то всеобъемлющее по потокам? :)


Чарльз Калверт. "Дельфи Х. Энциклопедия пользователя"
Джефри Рихтер. Windows для профессионалов.

Ну, и

Tutorial on thread programming in Delphi:

http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
http://www.sklobovsky.com/community/threadmare/threadmare.htm

Handling exceptions in a thread:
http://community.borland.com/article/0,1410,10452,00.html

by Tolik Tentser:

http://www.compress.ru/Article.asp?id=2164

--
Regards, LVT.


 
Eraser ©   (2005-08-09 13:13) [12]

злобная танька   (09.08.05 11:38) [9]

Впринципе в вашем примере пост [1] и [2] не играет роли... должно работать и так и эдак, если WND действительно глобальная переменная.

только вот это "деструктор выполняется в контексте главного потока приложения" всё равно не понятно. не подскажите линк на что-то всеобъемлющее по потокам? :)

Про потоки лучше всего почитать у Рихтера http://www.podgoretsky.com/ftp/Docs/Classics/Richter/richter4ru.zip
Но класс для работы с потоками TThread это еснно чисто делфивская оболочка, для удобства работы с потоками. Читать про неё лучше всего в справке.


 
Digitman ©   (2005-08-09 15:21) [13]


> "деструктор выполняется в контексте главного потока приложения"
> всё равно не понятно.


исходники TThread смотрела ?



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

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

Наверх




Память: 0.5 MB
Время: 0.03 c
14-1122051595
SoftX
2005-07-22 20:59
2005.08.28
Аниме=эротика?


1-1123494602
gemini
2005-08-08 13:50
2005.08.28
О DLL


8-1113715157
dr Tr0jan
2005-04-17 09:19
2005.08.28
Построение дуги между двумя точками


3-1121338676
erika
2005-07-14 14:57
2005.08.28
Построение запросов и поиск по полям


3-1121844784
alex_***
2005-07-20 11:33
2005.08.28
ADO и view