Форум: "Потрепаться";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
ВнизПроблема с деструктором потока Найти похожие ветки
← →
Прохожий (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c