Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Хочу создать Поток убиваемый через время


Автор: Denchik 10.5.2008, 21:43
Есть такой код в котором создается поток ,
потом мы должны его убить при любых обстоятельствах через какое-то время

Код

while ThreadCount<2 do
  begin
T[ThreadCount]:=TMyThread.Create(True);
T[ThreadCount].changefile:=FullFileName;
// Нужно процесс убить через какоето время 
T[ThreadCount].Resume;


помогите переделать вот такую функцию , расчитанную на аналогичную задачу , только запускающая 
внешнюю программу 

Код

function ExecuteAndWait(FileName: string; HideApplication: boolean): boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  exitc: cardinal;
begin
  FillChar(StartupInfo, sizeof(StartupInfo), 0);
  with StartupInfo do begin
    cb := Sizeof(StartupInfo);
    dwFlags := STARTF_USESHOWWINDOW;
// Если шоу то прикольно всплывают окна
    wShowWindow := SW_HIDE;
  end;
  if not CreateProcess(nil, PChar(FileName), nil, nil, false,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
    StartupInfo, ProcessInfo) then result := false
  else begin
    if HideApplication then begin
      Application.Minimize;
      ShowWindow(Application.Handle, SW_HIDE);
      WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
    end else
      while WaitforSingleObject(ProcessInfo.hProcess, 100) =
        WAIT_TIMEOUT do begin
        Application.ProcessMessages;
        if Application.Terminated
          then TerminateProcess(ProcessInfo.hProcess, 0);
      end;
    GetExitCodeProcess(ProcessInfo.hProcess, exitc);
    result := (exitc = 0);
    if HideApplication then begin
      ShowWindow(Application.Handle, SW_SHOW);
      Application.Restore;
      Application.BringToFront;
    end;
  end;
 

Автор: Albinos_x 10.5.2008, 23:40
не лучше ли это делать в потоке?

Автор: MetalFan 11.5.2008, 21:33
убивать поток(TThread в данном случае) не стоит, ибо приведет скорее всего к утечке ресурсов.
лучше выставлять флаг (Terminate-Terminated) и его в самом потоке анализировать.

Автор: Denchik 12.5.2008, 21:50
Меня интересует что-то типа этого кусочка 
Код

 while WaitforSingleObject(ProcessInfo.hProcess, 100) =

То есть смысл убрать поток , если прошло какоето достаточно большое время после запуска потока 



Автор: Beltar 13.5.2008, 10:12
Что-то я не понял. Ты создаешь TThread, а в примере у тебя CreateProcess. Это разные вещи.
Как тебе говорят просто мониторь в потоке Terminated по-другому его не убить. А так отработает Execute и конец потоку.

Автор: Denchik 13.5.2008, 11:48
Пример с функцией для запуска программ и их завершением через таймаут

Мне нужен для ситуаций когда поток виснет ( изредка бывает ) 
Получается нужно прикрутить WaitforSingleObject , чтобы он опрашивал поток 

А как мониторить поток ?
с таймером ???



Автор: MetalFan 13.5.2008, 13:12
Цитата(Denchik @  13.5.2008,  11:48 Найти цитируемый пост)
Мне нужен для ситуаций когда поток виснет ( изредка бывает ) 

код потока - твой? так что, отладить что там "виснет" чтоли нельзя? 
да, поток (в терминологии ОС) как и процесс убить можно. 
но тут(в случае с потоком) ты на 99% получишь утечку ресурсов (ибо в случае с процессом система сама почти весь "мусор" подчищает). 
если тебе это не критично, то убивай на здоровье - TerminateThread

з.ы. вариант - сделать отдельный процесс(вместо потока) и мониторить его. будет более логичным имхо для избежания утечки ресурсов.

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