Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
7-93266
isc
2002-09-28 09:54
2002.11.28
LPT порт


1-93109
Mafsha
2002-11-17 16:35
2002.11.28
Как перевести время в секунды?


3-92914
4x4
2002-11-11 14:20
2002.11.28
TQuery и Access???


6-93176
Дмитрий К.К.
2002-10-01 15:51
2002.11.28
Kazaa


7-93273
Dimosha
2002-09-26 18:01
2002.11.28
PowerOff, Reboot, Suspend, LogOff





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский