Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хочу создать Поток убиваемый через время 
:(
    Опции темы
Denchik
Дата 10.5.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 16.5.2006

Репутация: нет
Всего: нет



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

Код

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;
 
PM MAIL   Вверх
Albinos_x
Дата 10.5.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



не лучше ли это делать в потоке?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
MetalFan
Дата 11.5.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Denchik
Дата 12.5.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 16.5.2006

Репутация: нет
Всего: нет



Меня интересует что-то типа этого кусочка 
Код

 while WaitforSingleObject(ProcessInfo.hProcess, 100) =

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



PM MAIL   Вверх
Beltar
Дата 13.5.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Denchik
Дата 13.5.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 16.5.2006

Репутация: нет
Всего: нет



Пример с функцией для запуска программ и их завершением через таймаут

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

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



PM MAIL   Вверх
MetalFan
Дата 13.5.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



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

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

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

Это сообщение отредактировал(а) MetalFan - 13.5.2008, 13:14


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.