Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизПрогрес процесса и независимые процессы Найти похожие ветки
← →
Новый (2005-09-15 10:39) [0]Поискал я по форуму и ответа так и не нашёл!
Вообщем суть:
Из формы 1 я запускаю CreateProcess(). У меня там какое-то время что-то делается.... в этот момент вся прога зависает, до окончания процесса.
А мне то нужно:
1. Из формы 1 запустить процесс
2. Спрятать эту форму. Вместо неё вывести форму 2, где стоит ProgressBar(или что там нужно, чтобы бежало и показывало, сколько уже выполнено... )
3. ProgressBar на форме 2 показывает статус завершения процесса, запущеного из формы 1.
4. В это время иконка в трэе мигает, пока работает процесс.
Мне бы очень хотелось пример... примерно такого содержания:
form1; //Main Form
uses Uni2;
.....
Procedure Form1.Button1.Click(....);
begin
CreateProcess(nil, PChar(Мой процесс), nil, nil, True, 0, nil, nil, SI, PI);
Form2:=Tform2.create;
Form2.ShowModal;
end;
end.
form2; //Modal Form
uses Unit1;
.....
Procedure Form2.КнопкаОтменыClick();
begin
Убить мой процесс;
Form1.visible:=true;
Form2.Close;
end;
Procedure Form2.FormCreate();
begin
Form1.visible:=false;
MyTrayIcon.Animated:=true;
Взять статус из CreateProcess(nil, PChar(Мой процесс), nil, nil, True, 0, nil, nil, SI, PI); и запехать его в ProgressBar;
После окончания MessageDlg("Процесс закончился",mtinformation, [mbok], 0);
Form2.Close;
end;
end.
Ну может тогда хоть кто-нибудь ссылку даст на исходник... хоть для примера. как реализовать то такое. я уже запарился искать - всё без результатов...
← →
Digitman © (2005-09-15 11:51) [1]
> Взять статус из .. Мой процесс.. и запехать его в
а "Мой процесс"-то знает о том , что от него требуется "отчитываться о его статусе" ? Что вообще такое "статус процесса" в твоем понимании ?
← →
ANB © (2005-09-15 12:11) [2]
> Взять статус из CreateProcess(nil, PChar(Мой процесс), nil,
> nil, True, 0, nil, nil, SI, PI); и запехать его в ProgressBar;
>
Для сего нужно иметь доступ к исходнику "Мой процесс" и в нем и своей проге организовать обмен сообщениями о состоянии выполнения.
← →
Новый (2005-09-15 13:48) [3]Вот исходник. Взято из http://forum.vingrad.ru и мной модернизированно для задачи получени кода возврата архиватора winrar.console и вывода всех данных в лог-фаил...
Статус процесса в моём понимании - типа статус установки программы, показывает сколько завершено % и сколько осталось, ну вообщем progressbar (или gauges какой-то ещё на вкладке samples есть)
Я не шарю в прцессах, вот поэтому это и сложно...
function GetDosOutput(const CommandLine:string): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of Char;
BytesRead: Cardinal;
//ExitCode : dword; // код возврата архиватора
begin
ZeroMemory(@si, sizeof(si));
si.cb := SizeOf(si); // размер структуры в байтах
si.dwFlags := STARTF_USESHOWWINDOW;
Application.ProcessMessages;
with SA do
begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
// создаём пайп для перенаправления стандартного вывода
CreatePipe(StdOutPipeRead, // дескриптор чтения
StdOutPipeWrite, // дескриптор записи
@SA, // аттрибуты безопасности
0 // количество байт принятых для пайпа - 0 по умолчанию
);
try
// Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
// а так же проверяем, чтобы он не показывался на экране.
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
// Запускаем компилятор из командной строки
WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI);
// Теперь, когда дескриптор получен, для безопасности закрываем запись.
// Нам не нужно, чтобы произошло случайное чтение или запись.
CloseHandle(StdOutPipeWrite);
// если процесс может быть создан, то дескриптор, это его вывод
if not WasOK then
ExitCode := 999
else
try
// получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
Line := "";
repeat
// читаем блок символов (могут содержать возвраты каретки и переводы строки)
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
// есть ли что-нибудь ещё для чтения?
if BytesRead > 0 then
begin
// завершаем буфер PChar-ом
Buffer[BytesRead] := #0;
// добавляем буфер в общий вывод
Line := Line + Buffer;
end;
until not WasOK or (BytesRead = 0);
// ждём, пока завершится консольное приложение
GetExitCodeProcess(pi.hProcess, ExitCode); // получаем код возврата
finally
// Закрываем все оставшиеся дескрипторы
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
finally
//result:=Line
//result:=ExitCode
CloseHandle(StdOutPipeRead);
end;
← →
Новый (2005-09-15 13:52) [4]и как с остальным быть? в этом-же коде что-то править?
Нужно чтобы статус отражался в форме2, и иконка мигала, и архивация шла!
Получается нужно 3 процесса (или потока, или что там?) нужно создавать?
1 - форма2 и её прогресбар
2 -мигание иконки в трэе
3 - сам CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI);
← →
Digitman © (2005-09-15 14:16) [5]WinRAR - не твоя твоя программа.
И она не обязана отчитываться перед тобой о каких-то "процентах".
← →
Новый (2005-09-15 16:58) [6]а я думал что не winrar а процесс отчитывается...
я что не правильно думал?
а как тогда делают чтобы процесс отчитывался перед прогрес баром?
← →
ANB © (2005-09-15 17:16) [7]
> Новый (15.09.05 16:58) [6]
- процесс - это объект ядра (поправьте меня мастера, если я не прав) и он сам по себе вообще ничего не делает.
Отчитываться может программа, которая работает в этом процессе, но ее нужно научить это делать (написать самому, найти исходники и поправить (гыгы), найти доку и посмотреть, может она уже умеет это делать). А уже после этого можно рисовать прогресс-бар и прочие рюшечки.
← →
alpet © (2005-09-15 19:18) [8]Вам автор похоже не хватает понимания задачи - поскольку постановка ее сделана вами из рук вон плохо. Насколько я смог понять, некоторая программа должна анализировать все-то (), что выдает консольная версия программы WinRar на устройство стандартного вывода (т.е. консоль по умолчанию). Вроде бы не такая уж и сложная задача, так что непонятно, какой вопрос вас более всего смущает: получение текстовой информации от WinRar, или ее переработка. Если последнее - поверьте это к не относится к конференции, вам надо для этого алгоритм придумывать.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c