Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
14-1122966208
silvestr
2005-08-02 11:03
2005.08.28
Безопасность MS SQL 2000


14-1123170240
Димитрий
2005-08-04 19:44
2005.08.28
Программист vs Инженер-программист


1-1123392246
Antonn
2005-08-07 09:24
2005.08.28
перемещение контрола за всю клиентскую область


3-1121339475
ks
2005-07-14 15:11
2005.08.28
Изменение даных в TQuery


10-1101293713
Vitalik
2004-11-24 13:55
2005.08.28
Библиотека типов для модулей расширения (плагинов)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский