Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1128281938
Сергей (гость)
2005-10-02 23:38
2005.11.13
EhLib и Lookup-поля


14-1129843959
beglec
2005-10-21 01:32
2005.11.13
Как работать с почтой


1-1129897332
2Wish
2005-10-21 16:22
2005.11.13
Движение мыши в PaintBox


3-1127800437
XGarik
2005-09-27 09:53
2005.11.13
Обращение к полю XML


2-1129702622
Phoenix
2005-10-19 10:17
2005.11.13
Закрашивание строк в ListView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский