![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск и завершение программы принудительно. [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, там все по полочкам разложено
Желаю успехов