Avatar billede ruma1974 Nybegynder
13. december 2006 - 17:30 Der er 10 kommentarer og
1 løsning

problemer med at køre et program og vendte

Hej,

Jeg fandt nedenstående kode på delphi about hjemmeside

http://delphi.about.com/od/windowsshellapi/a/executeprogram.htm

Problemet er at delphi bruger alt processer tid i det nederst loop uden at det eksterne program bliver afviklet. Det ser ud til application.processmessage ikke bliver udført.


ExecuteFile:='calc.exe';
ParamString:='paramters.txt';
  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!') ;
Avatar billede kroning Nybegynder
13. december 2006 - 17:54 #1
prøv at indsætte en Sleep(50);
Avatar billede ruma1974 Nybegynder
13. december 2006 - 17:58 #2
Jeg bør nok lige nævne at det i mit tilfælde er et java program jeg starter op fra delphi
Avatar billede ruma1974 Nybegynder
13. december 2006 - 18:06 #3
sleep(50); gav samme resultat

problemet er nok i virkeligheden at programmet ikke starter ordentligt op. Jeg kan se vinduet af java programmet men der sker ikke noget.

Når jeg start på samme måde direkt fra kommando linen så køre java programmet fint. Det start - laver en output fil - og lukker ned
Avatar billede psycosoft-funware Nybegynder
13. december 2006 - 19:15 #4
uses
  ShellApi;

procedure ShellExecute_AndWait(FileName: string; Params: string);
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    ExInfo.lpVerb := 'open';
    ExInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellExecute_AndWait('FileName', 'Parameter');
end;

denne kode virker, bruger den selv... :)
Avatar billede ruma1974 Nybegynder
14. december 2006 - 00:04 #5
Jeg tror problemet er at det er et java program. Ovenstående eksemple fra psycosoft-funware starter også java programmet fint op og vendter. Men java programmet bruger ikke på noget tidspunkt procesorer resource til at køre den process som den burde og den lukke heller ikke ned som den burde. Java programmet køre fint fra commando linien - starter - laver beregningerne - gemmer resultatet - og lukker ned. Fra delphi ser det ud som om program vinduet kun startes også sker der ikke mere.
Avatar billede pidgeot Nybegynder
14. december 2006 - 12:16 #6
Et bud ville være at din classpath ikke indeholder stien til de filer der udgør Java-programmet, og den derfor fejler. Med mindre det er nævnt i din CLASSPATH-systemvariabel, skal du bruge parameteren -cp når du starter Java-programmet - eller lave en JAR ud af det, da den ikke påvirkes af den slags (hvis der er eksterne libraries skal JAR'en indeholde de oplysninger der skal bruges til det - i hvert fald hvis det ikke er en del af din classpath).
Avatar billede ruma1974 Nybegynder
14. december 2006 - 21:37 #7
Jeg har alt i en jar fil. Hvis det er på grund af CLASSPATH så ville jeg tro at problemet også ville værre der når det startes fra commando linien.

Er der ikke noget med at man kan konverter jar til .exe filer? Det er nok mere et spørgsmål for et java forum. Det vil jeg lige se nærmere på.
Avatar billede pidgeot Nybegynder
14. december 2006 - 23:31 #8
.EXE-filerne er, så vidt jeg husker, blot et mini-program der starter .JAR'en "korrekt". Det vil derfor ikke hjælpe det store hvis du allerede nu gør det præcist som kommandolinien og det er en .JAR :)

Du kan evt. gøre det at du prøver at få dit program til at starte det via en .bat-fil hvor du har sat "pause" som sidste linie, så du kan nå at se hvilket output dit Java-program kommer med.
Avatar billede ruma1974 Nybegynder
15. december 2006 - 20:49 #9
Nu fik jeg det til at virke. Jeg forstår ikke helt hvorfor.

Når jeg køre processen er det nøvnedigt at specificere NORMAL_PRIORITY_CLASS ellers fik java programet lav priotet. Det var også nødvendigt at start java programmet fra en bat fil.

For mig virker shellexecute som vinden blæser men det er nok fordi jeg ikke har læst nok om shellexecute.

pidgeot hvis du laver et svar får du point da det var dig der gav det afgørende tip.

Jeg takker alle for hjælpen
Avatar billede pidgeot Nybegynder
15. december 2006 - 20:52 #10
Kommer her :)

Skal ikke lige kunne sige hvorfor den går til lav prioritet - det er mig bekendt ikke noget den bør gøre - men det vigtigste er vel at det virker :)
Avatar billede ruma1974 Nybegynder
15. december 2006 - 20:54 #11
Du har helt ret ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester