![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread [D7]
злобная танька © (2005-08-08 21:04:00)Привет!
в общем ситуация такая: есть просто окно винапишное, оно при создании запускает поток, который должен кое-что выполнить а потом закрыть это окно. Для окна сохраняется хэндл 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 показывает.
Digitman (2005-08-09 15:21:00) [1]
> "деструктор выполняется в контексте главного потока приложения"
> всё равно не понятно.
исходники TThread смотрела ?
Eraser (2005-08-09 13:13:00) [2]злобная танька (09.08.05 11:38) [9]
Впринципе в вашем примере пост [1] и [2] не играет роли... должно работать и так и эдак, если WND действительно глобальная переменная.
только вот это "деструктор выполняется в контексте главного потока приложения" всё равно не понятно. не подскажите линк на что-то всеобъемлющее по потокам? :)
Про потоки лучше всего почитать у Рихтера http://www.podgoretsky.com/ftp/Docs/Classics/Richter/richter4ru.zip
Но класс для работы с потоками TThread это еснно чисто делфивская оболочка, для удобства работы с потоками. Читать про неё лучше всего в справке.
Leonid Troyanovsky (2005-08-09 13:08:00) [3]
> злобная танька (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.
Mx (2005-08-09 12:25:00) [4]
> злобная танька (09.08.05 11:38) [9]
> ps: сейчас всё отлично работает, наверное вчера виндовс
> глючил немного или что-то такое
Такие заявления чреваты будущими ошибками. Советую еще все раз по десять прогнать. Скорее всего проблема не решена, а просто ошибка ввиду каких-то временных условий не возникает.
злобная танька (2005-08-09 11:38:00) [5]> Leonid Troyanovsky © (09.08.05 09:42) [8]
не, WND это не поле TThread2. это глобальная переменная.
ps: сейчас всё отлично работает, наверное вчера виндовс глючил немного или что-то такое :)
только вот это " деструктор выполняется в контексте главного потока приложения" всё равно не понятно. не подскажите линк на что-то всеобъемлющее по потокам? :)
Leonid Troyanovsky (2005-08-09 09:42:00) [6]
> evvcom © (09.08.05 09:34) [7]
>
> > BiN © (09.08.05 09:11) [6]
>
> А разница какая?
Видимо, WND поле класса TThread2.
--
Regards, LVT.
evvcom (2005-08-09 09:34:00) [7]
> BiN © (09.08.05 09:11) [6]
А разница какая?
BiN (2005-08-09 09:11:00) [8]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 08:33:00) [9]А ExitFlag зачем? Достаточно Terminated.
> подскажите, из-за чего это м.б.?
Из-за ошибки в программе. Скорее всего в 17-й строке. Да, да, именно в 17-й...
Eraser (2005-08-08 22:46:00) [10]злобная танька (08.08.05 21:52) [3]
Until ExitFlag;
Попробуй примерно так
Until ExitFlag and Terminated;
злобная танька (2005-08-08 21:52:00) [11]спасибо вам, работать стало лучше, но всё равно как-то не очень :)
иногда при закрытии возникает ошибка "Приложение будет закрыто. Приносим извинения за неудобства". я в принципе и не против того, чтобы оно было закрыто, но реакция виндовса какая-то странная.. отчего это может быть?
там в Execute второго потока цикл:
Repeat
...
Until ExitFlag;
PostMessage(.....
Внутри цикла может возникнуть ситуация, что он завершится, и тогда будет отправлено WM_CLOSE в главный поток..
а есть второй способ выхода - по Alt+F4. Второй способ работает всегда без ошибок, а первый иногда выдаёт это.. "Приложение будет закрыто". бывает редко, но всё равно неприятно :(
подскажите, из-за чего это м.б.?
Eraser (2005-08-08 21:17:00) [12]злобная танька (08.08.05 21:04)
Делов том, что данный деструктор выполняется в контексте главного потока приложения.
Defunct (2005-08-08 21:10:00) [13]злобная танька (08.08.05 21:04)
для начала поместить PostMessage в тело Execute (последней строчкой).