Цитата:
Сообщение от novashdima
так у меня процедура анализ вызывается только при начале обработки, соответственно проверка выполниться только один раз до какой-либо работы потока.
|
Метод Execute это уже и есть работа потока, так что проверка выполнится уже во время работы параллельного потока, и не один раз - там же цикл "while not Terminated do", т.е. пока поток не попросят завершиться этот цикл будет вертеться. Хотя конечно ничто не мешает поставить проверку и после вызова Analys

Цитата:
Сообщение от novashdima
Вот это уже хорошая идея, надо будет попробовать.
|
Можно сделать ещё проще - с помощью InterlockedExchange:
Код:
type
MyThread = class(TThread)
private
FSuspendNeeded: LongBool;
procedure SetSuspendNeeded(const Value: LongBool);
public
property SuspendNeeded: LongBool read FSuspendNeeded write SetSuspendNeeded;
protected
procedure Execute; override;
end;
{ MyThread }
procedure MyThread.Execute;
begin
while not Terminated do
begin
Analys;
if SuspendNeeded then Suspend;
end;
end;
procedure MyThread.SetSuspendNeeded(const Value: LongBool);
begin
if FSuspendNeeded <> Value then
Windows.InterlockedExchange(LongInt(FSuspendNeeded), LongInt(Value));
end;
Таким образом в главном потоке можно без проблем просить приостановки параллельного потока:
Код:
AnalysThread.SuspendNeeded := True;
А через свойство AnalysThread.Suspended периодически проверять не приостановлся ли уже поток.
Цитата:
Сообщение от novashdima
Так этот код выполняется только если вылетело исключение, там же try except, если все завершилось удачно то ничего не разрушается 
|
Но при ошибке то разрушается. И тем временем уже созданный параллельный поток будет пытаться работать с уже разрушенным объектом.