Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Прогрес процесса и независимые процессы   Найти похожие ветки 

 
Новый   (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 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
6-1122979880
Readen
2005-08-02 14:51
2005.11.13
IdHTTP: ContentRangeStart и ContentRangeEnd


14-1130133309
TUser
2005-10-24 09:55
2005.11.13
Квантовая телепортация


14-1130164522
Igorek
2005-10-24 18:35
2005.11.13
Много ли вы печатаете на работе?


6-1122847694
Flood_control
2005-08-01 02:08
2005.11.13
Как организовать отображение на ShellListView


9-1120030753
Зм1й
2005-06-29 11:39
2005.11.13
Морфинг