Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > TOracleSession.BreakExecution


Автор: Budy 20.5.2011, 08:11
:Приветствую
В отдельном потоке в отдельной сессии TOracleSession выполняю долгий SELECT (порядка 7-10 минут). Это дает пользователю выполнять основные функции формы.
При FormClose проверяю, если поток еще живой, то пытаюсь его Free.

Код

{ TStatUpdaterThread }
  TStatsUpdaterThread = class(TThread)
  public
    procedure Free;
  private
    OracleSession: TOracleSession;
  protected
    procedure Execute; override;
  end;
...
SUT: TStatsUpdaterThread; // Поток для обновления статов
...
procedure TMainForm.FormDestroy(Sender: TObject);
begin
  // Остановка потока
  if (SUT <> nil) then
    SUT.Free;
end;
...
procedure TStatsUpdaterThread.Free;
begin
  try
    OracleSession.BreakExecution; // !! Запрос не останавливается
    OracleSession.LogOff; // !! Тут вылазит 3 эксепшна
  except
    // Ошибка при стопе
    on e: Exception do
      Log('Exception: TStatsUpdaterThread.OracleSession.LogOff::'+e.Message); // Просто логируется в файлик
  end;
  OracleSession.Free;
  // nil для объекта
  FreeAndNil(SUT);
end;


В редких случаях прога не убивается при закрытии, а просто прячется и висит, загружая проц до 100%.
На OracleSession.BreakExecution ничего не происходит, а OracleSession.LogOff грязно ругается.

Внимание, вопрос:
- Как можно "мягко" завершить выполнение операции?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)