Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2010, 20:30   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Вопрос Завершить программу в указанное время

Привет всем!
Вопрос как завершить процесс в указанное время?

Процесс(Программа) запускается в потоке и моя программа ждёт завершение запущенного процесса, как в указанное время завершить процесс?

Допустим завершить в 17:00 ..
Человек_Борща вне форума Ответить с цитированием
Старый 16.09.2010, 20:51   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Поставьте таймер и в нём через секунду считывайте системное время и сверяйте его со своим. Если время совпало, то вызывайте функцию, завершающую процесс. На форуме многократно выкладывались функции для завершения процесса.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 16.09.2010, 20:54   #3
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Вам собственный процесс убить или чужой?
Если свой то вот так
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
 SystemTime: TSystemTime; //Некое время
begin
GetLocalTime(SystemTime); //Получаем системное время
if SystemTime.wHour=20 then begin  //Результату присваиваим Час(wHour)
if SystemTime.wMinute=47 then begin
application.Terminate;
end;
end;
end;
если чужой то вот так
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
h:HWND;
begin
h:=FindWindow(nil,'>>>Здесь напишите заголовок программы<<<')
if h<>0 then begin
SendMessage(h,WM_DESTROY,0,0);
end;
end;
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 16.09.2010, 21:17   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Примерно так:
Код:
procedure TAppThread.Execute;
var
  i: integer;
  Params: string;
  CODDatesepar: Char;
  wd:HWND;
begin
  repeat
    for i := 1 to 10 do //рестарт программы после старта hlr
    begin
      Sleep(AppInfo.AppFirstStart * 100);
      {if AppInfo.AppFirstStart <= 9 then //если больше или равно 9
        Sleep(AppInfo.AppFirstStart * 1000) //Если число от 1 до 9 то умножаем на 100 чтобы получать секунды
      else
        Sleep(AppInfo.AppFirstStart * 100); //иначе всё на сотню...
        }
      if Terminated then //проверка не тормазнут ли поток
        Exit;
    end;
    hlrLog_AddtoAppLog('Запуск программы: ', AppInfo.AppName);
    while AppInfo.AppStart do //пака стоит галочка "запуск при старте HLR"
    begin
      ZeroMemory(@SI, SizeOf(SI)); //нулируем данные о процессе
      DateSeparator := '/'; //сепаратор дыты
      Params := StringReplace(AppInfo.AppParamStr, '%cod_datetime%', FormatDateTime('mm/dd/yyyy hh:nn:ss', now), [rfReplaceAll, rfIgnoreCase]);

      with SI do // где по этому достать документацию???
      begin
        cb := SizeOf(SI);

        if AppInfo.AppIsConsole then
        begin
        dwFlags:=STARTF_USESHOWWINDOW;
        if AppInfo.AppConStartMin then
        wShowWindow:=SW_SHOWMINIMIZED
        else
        wShowWindow:=SW_SHOWNORMAL;

        if not Length(AppInfo.AppConCaption) = 0 then
        lpTitle:=PChar(AppInfo.AppConCaption);
        end;
      end;

      with PI do
      begin
        SetProcessAffinityMask(hProcess, AppInfo.AppCPUAffinity); //приоритет процесса
        WaitForSingleObject(hProcess, INFINITE); //Ждём завершения программы бесконечно..
        CloseHandle(hProcess); //закрываем хендл процесса
        CloseHandle(hThread); //закрываем хендл потока
      end;

        CreateProcess(
        PChar(AppInfo.AppExe),
        PChar(AppInfo.AppParamStr), nil, nil,
        False, GetPriority(AppInfo.AppPriority), nil,
        PChar(ExtractFileDir(AppInfo.AppExe)), SI, PI);


      for I := 1 to 10 do
      begin
        {if AppInfo.AppSecondStart <= 9 then //Фикстим тот же баг=)
          Sleep(AppInfo.AppSecondStart * 1000)
        else //иначе множим на сотню..
          Sleep(AppInfo.AppSecondStart * 100); }
        Sleep(AppInfo.AppSecondStart * 100); 
        if Terminated then
          Exit;
      end;

      hlrLog_AddtoAppLog('Перезапуск программы: ', AppInfo.AppName);
    end;
until AppInfo.AppRestart <= 0;
end;
То что создаёт CreateProcces нужно закрыть в указанное время...
Человек_Борща вне форума Ответить с цитированием
Старый 16.09.2010, 21:52   #5
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Используйте функцию TimeToStr(Now) для получения текущего времени.
Из функции CreateProcess берите PID созданного процесса (последний параметр функции и в нём dwProcessId).
Когда время совпадёт гасите процесс по PID. Тут модуль. Может поможет: http://programmersforum.ru/showthread.php?t=80214
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 16.09.2010, 23:18   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Тоесть примерно так.. ?:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  sysTime: Tsystemtime;
begin
  GetLocalTime(SysTime);
  if (HEdit.Text = '00') and (MEdit.Text = '00') then
  begin
    ShowMessage('Time not entered. Exiting...');
    Timer1.enabled := False;
    Exit;
  end
  else
  begin
    if (SysTime.wHour = StrToInt(HEdit.Text)) and (SysTime.wMinute = StrToInt(MEdit.Text)) then
    begin
      KillTask(ProcessFileName(GetCurrAppPID));
      Timer1.Enabled := False;
    end;
  end;
end;
хм если с таймером всё понятно.. то как быть с делом в потоке?
Ведь таймер туда пихать грубо говоря, глупо..

Можете подсказать решение?

p.S. Terran , спасибо за великолепный модуль! Давно пользуюсь.. очень полезный и много где пригодился...
Человек_Борща вне форума Ответить с цитированием
Старый 16.09.2010, 23:42   #7
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Я имел в виду следующее.
В потоке у Вас создаётся процесс.
Код:
  CreateProcess(
        PChar(AppInfo.AppExe),
        PChar(AppInfo.AppParamStr), nil, nil,
        False, GetPriority(AppInfo.AppPriority), nil,
        PChar(ExtractFileDir(AppInfo.AppExe)), SI, PI);
Переменная PI не объявлена в процедуре запускающую поток, возможно она у Вас глобальная переменная. Опираясь на это из этой переменной при создании процесса можно узнать PID созданного процесса. (Не рискую завершать по имени т.к. имя может быть одинаковым у нескольких процессов)
И из этого всего получается код.
Код:
Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
If TimeToStr(Now) ='17:00:00' Then
Begin
KillTask(PI.dwProcessId);//Убиваем процесс по PID (PI.dwProcessId) - PID созданного процесса из потока
Timer1.Enabled:=False;
End;
End;
Цитата:
p.S. Terran , спасибо за великолепный модуль! Давно пользуюсь.. очень полезный и много где пригодился...
Не за что! Я рад, что он Вам понравился.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 17.09.2010, 00:45   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

хм это я понял но проблема в другом=)

Ваша догадка верна .. ProccesInformation это глобальная переменная так же как и StartupInfo

Моя программа по таймеру запускает заданные программы, каждая программа как поток(Представлен execute потока в 4 посту)... т.е. для каждой программы свой поток с параметрами от моей программы...
нужно реализовать что-то вроде таймера в потоке... вот в это всё и упирается..

p.S.
кстате в вашем модуле killTask за входной параметр принимает ExeFileName вместо PID...
Человек_Борща вне форума Ответить с цитированием
Старый 17.09.2010, 01:02   #9
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Если я правильно понял, то нужно определённые программы завершать в определённое время? Если да, то можно создать переменную типа TStringList и в ней хранить разные значения для разных процессов.
Цитата:
p.S.
кстате в вашем модуле killTask за входной параметр принимает ExeFileName вместо PID...
killTask это я для примера привёл. С PID работает функция ProcessTerminate
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 17.09.2010, 19:45   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Нет, нужно завершать те программы которые запускает МОЯ программа используя выше приведённый поток.

По этому вопрос стоит так:
Как реализовать сравнение времени(пака работает поток) и завершить программу в заданное время?

Код:
Может так? 
for i:=0 to 10 do
begin
If terminated then Exit;

{...Some code...}
end;
Но сомневаюсь я по поводу этого..

Последний раз редактировалось Человек_Борща; 17.09.2010 в 19:49.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
завершить программу в делфи 365307ксю БД в Delphi 3 22.06.2010 03:29
Как завершить программу из неосновного потока? itni Общие вопросы C/C++ 0 29.05.2010 16:42
Выполнить действие в указанное время sergeiqwe PHP 3 06.05.2010 16:28
Выключение компьтера в указанное время. Anohorett Общие вопросы Delphi 2 21.05.2009 23:42
Как завершить программу по условию Iceman Общие вопросы Delphi 8 14.03.2009 00:46