Показать сообщение отдельно
  #21  
Старый 12.03.2014, 18:59
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от 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, если все завершилось удачно то ничего не разрушается
Но при ошибке то разрушается. И тем временем уже созданный параллельный поток будет пытаться работать с уже разрушенным объектом.
Ответить с цитированием