Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск и завершение программы принудительно. [D3, Win2k]


()utLaw ©   (2002-10-20 00:00:00) 

Собственно, надо реализовать сабж. Т.е. запустить прогу и, если она за нужное ремя не завершилась, то скинуть ее.
Плз, пишите мне на мыло.


()utLaw   (2002-10-21 09:12:00) [1]

Я сделал так:

(************ Server.dpr ************)
program Server;

uses
Forms,
ServerMain in "ServerMain.pas" {ServerForm};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TServerForm, ServerForm);
Application.Run;
end.
(************ ServerMain.pas ************)
unit ServerMain;

interface

uses
// Messages, SysUtils, Graphics, Dialogs, StdCtrls,
Classes, Controls, StdCtrls,
Forms, Windows, ShellAPI;

type
TServerForm = class(TForm)
bRun: TButton;
procedure bRunClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ServerForm: TServerForm;

implementation

{$R *.DFM}

procedure TServerForm.bRunClick(Sender: TObject);
var
H:HWND;
dwPID: integer;
hProc: THandle;
begin
//Запускаем
h:= ShellExecute(Handle,"open",PChar("d:\Мои документы\Projects\Progs\Tester\TST.exe"),PChar(""{Параметры}),PChar("d:\Мои документы\Projects\Progs\Tester\"{Рабочая директория}),SW_NORMAL);
//Ждем
Sleep(3000{Время ожидания});
//Убиваем программу
if GetWindowThreadProcessId(H, @dwPID)<>0 then
hProc := OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwPID);
if hProc <> 0 then
TerminateProcess(hProc, 0);
end;

end.
(************ TST.PAS ************)
{Компилировано TurboPascal"ем}
begin
readln;
end.

но... Программа TST не завершается.... Что делать?

Программа должна тестировать олимпиадные задачи. Там есть лимит по времени, т.е. по прошествии N секунд задача убивается (если сама не завершилась) и выдается сообщение о непрохождении по времени. Иначе происходит анализ результатов.


Rouse_   (2002-10-20 10:55:00) [2]

Тогда первый вариант кода

Желаю успехов


()utLaw   (2002-10-20 10:51:00) [3]

А если прога запускается ДОСовская?


Rouse_   (2002-10-20 09:35:00) [4]

Нет, для этого лучше WM_QUIT

Желаю успехов


andrey_pst   (2002-10-20 08:27:00) [5]

Разрешите еще вопрос:
TerminateProcess выгружает dll, использующиеся "убиваемой" программой ?


Rouse_   (2002-10-20 05:36:00) [6]

Да не вопрос, ответ то дать можно, но почему бы и не посмотреть в факе?

Вот примерный алгоритм действий

procedure Demo_Start_Kill_Proc;
var
H:HWND;
dwPID: integer;
hProc: THandle;
begin
//Запускаем
h:= ShellExecute(Handle,"open",PChar(Расположение программы),PChar(Параметры),PChar(Рабочая директория),SW_NORMAL);
//Ждем
Sleep(Время ожидания);
//Убиваем программу
if GetWindowThreadProcessId(H, @dwPID)<>0 then
hProc := OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwPID);
if hProc <> 0 then
TerminateProcess(hProc, 0);
end;


Желаю успехов


Aleks1   (2002-10-20 04:11:00) [7]

Честно говоря общийответ на сабж, действительно есть в FAQ причем не один раз. Но, имхо, если привести подробности задачи, то ответ может быть гораздо лучше по всем параметрам.


Rouse_   (2002-10-20 00:05:00) [8]

Ну посмотри ты в FAQ, там все по полочкам разложено

Желаю успехов


Наверх

Титульная страница Поиск, карта сайта Написать письмо