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

Вниз

Проблема с деструктором потока   Найти похожие ветки 

 
Прохожий ©   (2003-09-24 12:59) [0]

Мастера, помогите неопытному програмеру найти косяк. Создаю поток он выполняеться, потом вызываю Terminate - выполняеться деструктор, но поток остаёться.
Создаю поток:
constructor P_Thread.CreateIt(перменные );
begin
inherited Create(true);
FreeOnTerminate := true;
// Set reference
Priority:=tpNormal;
Resume; // Continue the thread
while not PostThreadMessage(ThreadId, WM_USER, 0,0) do;

end;


Поток:


procedure SMTP_Thread.Execute;
var
Msg: TMsg;

begin

if WaitForSingleObject(Semaphore, INFINITE)=WAIT_OBJECT_0 then
begin
try
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
……

Код потока
……
finally
ReleaseSemaphore(Semaphore, 1, nil);
end; {end try}

end; {end if}

Terminate;
end;



Деструктор:


destructor P_Thread.Destroy;
begin

.....

inherited Destroy;

end;


Заметил такую штуку: если в код деструктора или перед вызовом Terminate всавить, например, ShowMessage(""), то всё Ok!
Подскажите что не так ?


 
Владислав ©   (2003-09-24 13:23) [1]

А зачем вообще тебе в Execute нужет Terminate? Поделись соображениями.


 
Прохожий ©   (2003-09-24 13:44) [2]

Есть условие, по которому процесс закрываеться


 
Digitman ©   (2003-09-24 13:48) [3]


> Прохожий


Ты хоть удосужился посмотреть в исходниках класса TThread, что конкретно делает метод Terminate ? Прежде чем про "условия" рассуждать ?

Судя по путанице в терминах "процесс" и "поток" - нет, не удосужился.


 
Прохожий ©   (2003-09-24 13:59) [4]

>Digitman ©
Блин, ну ошибся Я! Ты никогда ничего не путаешь???
Специально для тебя перепишу свою последную фразу так, как она должна была прозвучать:
"Есть условие, по которому ПОТОК закрываеться"


 
panov ©   (2003-09-24 14:05) [5]

>Прохожий ©

Кто знает, что у тебя творится в потоке...
Кода ведь ни у кого, кроме тебя, нет.


 
Владислав ©   (2003-09-24 14:06) [6]

> Прохожий © (24.09.03 13:59) [4]

Ну ё моё. Тебе же популярно сказали, что Terminate НЕ НУЖЕН В ТОМ МЕСТЕ.

"но поток остаёться." чт бы это значило? Да, кстати, а проблема то в чем, собственно говоря?


 
Palladin ©   (2003-09-24 14:09) [7]

а как было интересно определено что он остается?


 
Прохожий ©   (2003-09-24 14:09) [8]

>Digitman ©
Поясню и про "условие". Поток выполняет подбор параметра. Как только удалось его подобрать - сохраняються данные и поток завершаеться.
И какое отношение это имеет к классу TThread ?


 
Прохожий ©   (2003-09-24 14:18) [9]

>Palladin ©
а как было интересно определено что он остается?
View - DebugWindow - Threads

>Владислав ©
Да, кстати, а проблема то в чем, собственно говоря?
Проблема в том, что поток не завершаеться. Он просто виснет. Если в код деструктора или перед вызовом Terminate всавить, например, ShowMessage(""), то всё Ok!


 
Digitman ©   (2003-09-24 15:17) [10]


> Прохожий


> Поток выполняет подбор параметра. Как только удалось его
> подобрать - сохраняються данные и поток завершаеться.


но ты ж сам себе противоречишь !
раз поток завершается, почему ты говоришь, что он "остается" ?

ты вообще о чем ? о поточном VCL-классе TThread или о Win32-поточной функции ? Давай расставляй точки над i...


 
Прохожий ©   (2003-09-25 10:12) [11]

>Digitman ©
но ты ж сам себе противоречишь !
раз поток завершается, почему ты говоришь, что он "остается" ?


Такова идея, а на практике получаеться то, о чем я говорю. И я имел в виду поточный VCL - класс TThread.

Ещё вопрос. Ты мне предлагал посмотреть исходники класса TThread...Но, как я уже говорил в Делфи у меня маловато опыта. Как это сделать?


 
panov ©   (2003-09-25 10:15) [12]

Так ты приведешь код Execute или нет?

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


 
Прохожий ©   (2003-09-25 10:26) [13]

Да в том коде банальные обявления переменных, несколько математических формул и цикл для подбора парамеров и при получении нужной погрешности - сохранение параметров в файл и затем выполняеться Terminate. Всё



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

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

Наверх




Память: 0.5 MB
Время: 0.035 c
9-40229
Vital
2003-04-08 09:58
2003.10.13
OpenGL SGI


1-40438
Max_
2003-10-03 11:15
2003.10.13
RichEdit и Print


1-40354
3APA3A
2003-10-01 15:15
2003.10.13
Как правильно добавить значения в ValueListEditor???


1-40420
Agent[007]
2003-09-30 17:20
2003.10.13
xxx in xxx.pas ;


3-40296
lamer1
2003-09-22 14:11
2003.10.13
TSocketConnection