Завершение потока

McAndy
Дата: 04.12.2007 08:06:44
Объявляю свой класс потока

type
TmyThread = class(TThread)
public
constructor Create(vOperID, vLinkID: variant);
private
LinkID, OperID : variant;
protected
procedure Execute; override;
end;

implementation

procedure TMyThread.Execute;
begin
// тут пока пусто
end;

constructor TMyThread.Create(vOperID, vLinkID : variant);
begin
inherited Create(True);
FreeOnTerminate := True;
Priority := tpLowest ;
//далее заполняю поля потока
….
Resume;
end;

В программе создаю экземпляр потока:
vThread := TMyThread.create(1, 5); //vThread – глобальная переменная

Помогите понять, почему vThread = nil только при первом вызове. Я полагал, что если я устанавливаю FreeOnTerminate := True, то поток после выполнения самоуничтожится и переведет vThread в nil.
С потоками работаю впервые, сильно не пинайте :) Спасибо.
Tosh
Дата: 04.12.2007 08:16:31
За значение твое йпеременной отвечаешь только ты
McAndy
Дата: 04.12.2007 08:27:00
Tosh
За значение твое йпеременной отвечаешь только ты

т.е. поток освободил память, которую занимал, а переменная, ссылающаяся на этот поток, не обязательно равна nil? я правильно понял?
Tosh
Дата: 04.12.2007 08:31:49
Именно - переменная - это указатель, а указатель может ссылаться на что угодно - даже на мусор (как в данном случае)
McAndy
Дата: 04.12.2007 08:46:05
Tosh
Именно - переменная - это указатель, а указатель может ссылаться на что угодно - даже на мусор (как в данном случае)
понятно, спасибо
McAndy
Дата: 04.12.2007 08:58:01
А вот еще вопрос.
в программе идет серия запусков потока:
vThread := TMyThread.create(1, 5); //vThread – глобальная переменная
важен результат только последнего вызова.

как избежать выполнения потоков, кроме последнего? прерывать выполнение нельзя.
Bulygin Roman
Дата: 04.12.2007 09:10:12
McAndy
А вот еще вопрос.
в программе идет серия запусков потока:
vThread := TMyThread.create(1, 5); //vThread – глобальная переменная
важен результат только последнего вызова.

как избежать выполнения потоков, кроме последнего? прерывать выполнение нельзя.


А что должно делаться при запуске нового потока? Если надо дождаться окончания выполнения предыдущего потока(ов) -- используй критическую секцию, мутекс или семафор.

Если надо чтобы при запуске нового потокавсепрочиепотоки встали, то вместо глобальной переменной создай список работающих потоков и останавливай их по необходимости. До кучи избавься от FreeOnTerminate, чтобы в один прекрасный день не наловить AV
Anatoly Podgoretsky
Дата: 04.12.2007 09:19:00
А она тебе нужна?
Ты ее где то используешь?
Это же глобальная переменная и нафига она нужна при потоках, только что бы глюки ловить.
Напиши просто TMyThread.create(1, 5);
Anatoly Podgoretsky
Дата: 04.12.2007 09:21:24
автор
то вместо глобальной переменной создай список работающих потоков

TThreadList
McAndy
Дата: 04.12.2007 09:32:41
2 Роман и Анатолий : спасибо, буду пробовать.
автор
До кучи избавься от FreeOnTerminate, чтобы в один прекрасный день не наловить AV
-уже словил :) а как еще убивать исполненый процесс?