Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 7 odgovora
  • 2.713 pregleda

Najnovija ↓

"Hvatanje" zavrsetka ShellExecute 31.08.2011. u 11:15 · pre 184 meseca #1
Pozdrav svima,

Pokusao sam da na forumu pronadjem odgovor na mmoje pitanje, ali nisam imao srece.

Problem je sledeci :

Potrebno je detektovati kraj procesa koji se pokrece izvrsavanjem ShellExecute.

Konkretno, koristim shellExecute da bih izvrsio kopiranje MySql podataka izmedju 2 servera :
Code:

if ShellExecute(Handle, nil,'mysqldump.exe', PChar(params), nil, 1) <= 32 then
  begin
     MessageDlg('Greska prilikom izvrsavanja mysqldump! ',mtError,[mbOK],0);
     Exit;
  end;


Sama komanda se ispravno izvrsava, ali ono sto je potrebno jeste detektovati kraj izvrsavanja mysqldump komande (ShellExecute po default-u pokrece command prompt).
Prebacivanje podataka moze potrajati tako da rad samog programa mora biti pauziran dok se prebacivanje ne zavrsi.


Hvala
Re: "Hvatanje" zavrsetka ShellExecute 31.08.2011. u 11:35 · pre 184 meseca #2
Neces to postici sa ShellExecute funckijom .

Probaj sa ShellExecuteEx ili sa CreateProcess f-ijom da bi dobio procees id ili handle od procesa .

Onda imas vise opcija za ovo : GetExitCodeProcess ili WaitForInputIdle ako hoces odmah da cekas da se proces ne zavrsi .
Potpis
Viva lollapalooza
Re: "Hvatanje" zavrsetka ShellExecute 31.08.2011. u 11:49 · pre 184 meseca #3
Hvala, radi savrseno :D

Evo i primera sa delphi.about.com za slucaj da nekome treba nesto slicno.

Code:

 // Execute the Windows Calculator and pop up
 // a message when the Calc is terminated.
 uses ShellApi;
 ...
 var
    SEInfo: TShellExecuteInfo;
    ExitCode: DWORD;
    ExecuteFile, ParamString, StartInString: string;
 begin
    ExecuteFile:='c:\Windows\Calc.exe';
 
    FillChar(SEInfo, SizeOf(SEInfo), 0) ;
    SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
    with SEInfo do begin
      fMask := SEE_MASK_NOCLOSEPROCESS;
      Wnd := Application.Handle;
      lpFile := PChar(ExecuteFile) ;
 {
 ParamString can contain the
 application parameters.
 }
 // lpParameters := PChar(ParamString) ;
 {
 StartInString specifies the
 name of the working directory.
 If ommited, the current directory is used.
 }
 // lpDirectory := PChar(StartInString) ;
      nShow := SW_SHOWNORMAL;
    end;
    if ShellExecuteEx(@SEInfo) then begin
      repeat
        Application.ProcessMessages;
        GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
      until (ExitCode <> STILL_ACTIVE) or
      Application.Terminated;
      ShowMessage('Calculator terminated') ;
    end
    else ShowMessage('Error starting Calc!') ;
 end; 
Sviđa mi se1
Re: "Hvatanje" zavrsetka ShellExecute 01.09.2011. u 09:48 · pre 184 meseca #4
Hm...

Zar ne bi trebalo u repeat petlju ubaciti malecki Sleep(5), inace ubi procesor namrtvo (proveriti iz TaskManager-a) ?

Pozz
Re: "Hvatanje" zavrsetka ShellExecute 01.09.2011. u 09:52 · pre 184 meseca #5
Citat:
Rapaic Rajko: Hm...
...inace ubi procesor namrtvo (proveriti iz TaskManager-a) ?
Pozz

Tacno , ali ni Sleep() nije bas elegantno resenje, u tom slucaju bi trebao da koristi WaitForInputIdle koji ne ubija procesor vec samo ceka dok se proces ne zavrsi .
Potpis
Viva lollapalooza
Re: "Hvatanje" zavrsetka ShellExecute 01.09.2011. u 17:13 · pre 184 meseca #6
> Tacno , ali ni Sleep() nije bas elegantno resenje,

Sleep(10) je sasvim pristojno rešenje, nešto bolje je WaitForSingleObject, može se koristiti i gotovo rešenje koje ima JCL, ShellExecAndWait.

> u tom slucaju bi trebao da koristi WaitForInputIdle koji ne ubija procesor vec samo ceka dok se proces ne zavrsi .

WaitForInputIdle nije tome namenjen, on se koristi kada treba sačekati da se proces inicijalizuje i postane dostupan za rad sa korisnikom.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme