Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.058 c