Форум: "WinAPI";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
Вниз
Task Manager? Как его сделать многозадачным? Найти похожие ветки
← →
Filat (2002-10-11 19:52) [0]Привет ALL!
Вопрос вот какого плана. Сделал я свой Task Manager. Может запускать до 5-ти задач. Я его вставил в стандартный виндовый и поставил проверку на единственность запуска, чем так сказать повысил стабильность запуска других задач. Но в процессе его работы столкнулся с глюками, которые на моём компе не проявляются. Итак:
1. После запуска моего Task Manager стартуют 5 задач. Когда в процессе их работы пользуются Far-ом или ещё чем-то, т.е. запущенные задачи, почемуто теряется ...ну как его...ID процесса или ещё чего-то, в общем, при автоматическом закрытии потом этих приложений они не закрываются а работают. Через интервал - снова запуск и у меня 10!!! работающих приложений.
Запуск делаю так:
StartEn1:= False;
StartEn1:=CreateProcess(nil, PChar(Dir2.Text), nil, nil, FALSE, Create_New_Console, nil, nil, StartupInfo1, ProcessInfo1);
Закрытие так:
if StartEn1 then
begin
ProcessInfo1.hProcess:=OpenProcess (Process_Terminate, False, ProcessInfo1.dwProcessId);
if ProcessInfo1.hProcess <> 0 {Null} then
begin
TerminateProcess(ProcessInfo1.hProcess, 0);
CloseHandle(ProcessInfo1.hThread);
CloseHandle(ProcessInfo1.hProcess);
end;
end;
Как сделать чтобы небыло повторных запусков?
2. Ввод данных для запуска процессов делаю через Edit. А как (при помощи чего) можно сделать чтобы это число я мог менять автоматически, скажем 5-8-15... Если пользоваться типа StringGrid-ом, то как мне определить, что пришло время запустить именно этот процесс, а не другой? И как тогда строить конструкцию CreateProcess если я не знаю сколько их будет?
Мне это надо для 100%!!!! точного создания разных архивов, пока знаю, что из >12, в разных местах сети + распределение их по дням недели, дате и т.д. а потом уже ручками сносить пишушие на блины, т.е. задачи в основном будут досовские. Хотя может придётся купить и ZIPTV.
Спасибо, очень надеюсь на помощь!!!
← →
Дремучий (2002-10-12 00:10) [1]Как сделать чтобы небыло повторных запусков?
В приложении Делфи есть
1)AplicationTerminate
2)AplicationTerminated
Логично предположить что и для процессов есть подобная проверочная функция.
А как (при помощи чего) можно сделать чтобы это число я мог менять автоматически, скажем 5-8-15...
можно сразу делать через TTable и TDbGrid - создаешь подходящую структуру и вперед с песней... Введенные процессы сохраняться для последующих запусков. Не набивать же их каждодневно или ежечасно? :))
И как тогда строить конструкцию CreateProcess если я не знаю сколько их будет?
по таймеру (например, каждых 5 сек) пробегаешься по всех записях таблицы и анализируешь что надо, если событие наступило - запускаешь процес. Используешь конструкцию
while not Table1.eof
do begin
.....
Table1.Next;
end;
Гуд лак
:))
← →
Filat (2002-10-14 19:48) [2]Проверить какие приложения запущены, это можно. Но как сделать следующее:
1.На данный момент я запускаю одно и тоже приложение 4 раза, но при помощи батника. Настройка каждого из них идёт на порты с 1 по 4-й. Так вот, как узнать перед очередным цыклом запуска, что предыдущие остались, а не новое было запущено.
Запуск происходит так: 1-й CreateProcess - 10 сек. пауза, 2-й CreateProcess, 10 сек. пауза и д.т. до 4-го.
2. А если их (приложений) будет много и разных, как проверить до запуска, что оно запущено уже или ещё? Может можно определить откуда идёт запуск и потом от этого отталкиваться?
← →
Filat (2002-10-15 21:51) [3]Ну подскажите пожалуйста. :))
← →
Дремучий (2002-10-15 22:42) [4]сразу признаюсь - код не мой. :))
но этот пример должен тебе помочь
см. GetExitCodeProcess
procedure TfDisksRead.RunUnArch;
var
StartupInfo : TSTARTUPINFO ;
RarProcessInformation,
UtilProcessInformation:TProcessInformation;
fLoad : Boolean;
ecode : DWORD;
fl:TFileStream;
begin
With ArcLabel do begin
Caption:="Зачекайте ..";
Width:=fDisksRead.ClientWidth;
Visible:=True;
end;
Repaint;
// файл для протокола
fl:=TFileStream.Create(ProtName,fmCreate);
try
GetStartupInfo(StartupInfo);
StartupInfo.dwFlags := STARTF_USESTDHANDLES;
//StartupInfo.hStdOutput:=fl.Handle;
StartupInfo.hStdError:=fl.Handle;
// почистить католог для разархивирования
DelDir(CurDir);
// разархивировать информацию
StartupInfo.dwFlags := StartupInfo.dwFlags or STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:=SW_SHOWMINIMIZED;
fLoad:=CreateProcess(nil,pchar(Format(cmdLine,[ArcDir,CurDir])),nil,nil,False,
0,nil,nil,StartupInfo,RarProcessInformation);
repeat
sleep(100);
GetExitCodeProcess(RarProcessInformation.hProcess,ecode);
until ecode<>STILL_ACTIVE;
if ecode<>0 then
begin
Application.MessageBox("Ошибка разархивирования","Ошибка",MB_OK);
exit;
end;
// запустить файл на выполнение
StartupInfo.hStdOutput:=fl.Handle;
fLoad:=CreateProcess(pchar(CurDir+"update.bat"),nil,nil,nil,False,
0,nil,pchar(CurDir),StartupInfo,UtilProcessInformation);
ShowMessage("Поновлення закiнчилось успiшно");
finally
fl.Free;
sleep(2000);
CopyProtokol;
ArcLabel.Visible:=False;
end;
end;
← →
Filat (2002-10-16 20:28) [5]Дремучий, я извиняюсь, но частично разобрался в приколе.
Я не сказал вот что, что моя прога запускает 4-е приложения не на прямую а через батник, т.е. моя прога - батник (появляется дос окно) - приложение, не удивительно наверное, что теряется ID процесса, т.к. оно запоминает ID дос окна.
млин...
← →
pusrg (2002-10-16 21:07) [6]Для определения запущено ли какое-то приложение можно использовать мютексы, где-то в факе есть пример, сам им пользовался.
← →
Дремучий (2002-10-16 21:30) [7]>>pusrg
ну, допустим, запустил прогу - поставил ПОПУТНО мютекс(прога то чужая), а как знать когда она отработала, чтобы снять мютекс?
← →
Polevi (2002-10-17 13:02) [8]поток создать специальный и делать в нем WaitForMultipleObjects для хендлов запущенных процессов
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c