[ vortex77 @ 31.08.2011. 10:15 ] @
| 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 |
[ deerbeer @ 31.08.2011. 10:35 ] @
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 .
[ vortex77 @ 31.08.2011. 10:49 ] @
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;
[ Rapaic Rajko @ 01.09.2011. 08:48 ] @
Hm...
Zar ne bi trebalo u repeat petlju ubaciti malecki Sleep(5), inace ubi procesor namrtvo (proveriti iz TaskManager-a) ?
Pozz
[ deerbeer @ 01.09.2011. 08:52 ] @
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 .
[ savkic @ 01.09.2011. 16:13 ] @
> 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.
[ Aleksandar Đokić @ 01.09.2011. 16:17 ] @
ja bih proveravao listu procesa
[ salaczr @ 02.09.2011. 07:51 ] @
Mislim da nepotrebno trosis vreme i energiju.
Postoje vec neka resenja na netu za koja mislim da tacno odgovaraju tvojim potrebama.
http://www.swissdelphicenter.ch/torry/showcode.php?id=93
ako zelis da se proces koji si pokrenuo nevidi izmeni nShow na SW_HIDE
poz
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.