Avatar billede dsj Nybegynder
14. august 2002 - 17:01 Der er 12 kommentarer og
1 løsning

Problemer med Runtime.exec()

Jeg har lavet et launcher program til Half-Life som starter spillet med følgende kode:

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("D:\Half-Life\cs.exe -game cstrike osv...");
proc.waitFor();

Hvis ikke jeg skriver "proc.waitFor()" i main-tråden (i programmet) går mit program mens jeg spiller, eller når jeg lukker spillet. Puttes det i en tråd for sig selv, hvor jeg også skriver "proc.waitFor()" går programmet ned på samme vis.

Hvad går der galt og hvordan undgår jeg det? Kan jeg eventuelt starte spillet på anden vis??

Bruger i øvrigt JDK 1.4.1
Avatar billede dsj Nybegynder
14. august 2002 - 17:03 #1
Får i øvrigt følgende besked skrevet til en fil:

An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x0
Function=[Unknown.]
Library=(N/A)

NOTE: We are unable to locate the function name symbol for the error
      just occurred. Please refer to release documentation for possible
      reason and solutions.


Current Java thread:
    at sun.awt.windows.Win32OffScreenSurfaceData.nativeDispose(Native Method)
    at sun.awt.windows.Win32OffScreenSurfaceData.dispose(Unknown Source)
    at sun.awt.windows.Win32OffScreenSurfaceData.finalize(Unknown Source)
    at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
    at java.lang.ref.Finalizer.runFinalizer(Unknown Source)
    at java.lang.ref.Finalizer.access$100(Unknown Source)
    at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

Dynamic libraries:
0x00400000 - 0x00455000     C:\Program Files\NidaHLLauncher\Nida HL Launcher.exe
0x77F80000 - 0x77FFB000     C:\WINNT\System32\ntdll.dll
0x77DB0000 - 0x77E0C000     C:\WINNT\system32\ADVAPI32.dll
osv...
Avatar billede dsj Nybegynder
14. august 2002 - 17:04 #2
For at få det hele med: vel gerne UNDGÅ brugen af "proc.waitFor()", da programmet jo er låst mens spillet kører
Avatar billede emileej Nybegynder
15. august 2002 - 09:50 #3
Hvorfor må dit program ikke være låst imens du spiller?
Hvis det ikke må, kan du jo bare køre programmet i en ny tråd - eks:

class ProgramExecution implements Runnable{
    Runtime rt;
    String path;

    public ProgramExecution(Runtime rt, String path){
        this.rt=rt;
        this.path=path;
    }

    public void run(){
        rt.exec(path);
        proc.waitFor();
        System.out.println("Program execution:\n\t"+path+"\nHas now ended");
    }
}

Denne class skal du så bruge i din hovedclass således:

...
ProgramExecution CStrikeExec=new ProgramExecution(Runtime.getRuntime(),"D:\\Half-Life\\cs.exe -game cstrike");
Thread t=new Thread(CStrikeExec);
t.start();
...
//Herefter fortsætter dit program SAMTIDIGT med at spillet kører


E-)mil
Avatar billede dsj Nybegynder
15. august 2002 - 12:47 #4
At køre processen i en tråd for sig selv resulterer også i en fejl. Faktisk er det JVM der crasher, har jeg fundet ud af.

Grunden til at programmet ikke må være låst er, at man så lige (med Alt+Tab) kan gå ud og med let mit program kicke eller banne en spiller.
Avatar billede emileej Nybegynder
15. august 2002 - 12:50 #5
Hvis det er JVM der crasher, så send en bug report til sun. Desuden gør det jo heller ikke mit svar forkert - JVM brude køre koden helt fint :)

E-)mil
Avatar billede dsj Nybegynder
15. august 2002 - 13:50 #6
Jeg har dog foroven skrevet: "Puttes det i en tråd for sig selv, hvor jeg også skriver "proc.waitFor()" går programmet ned på samme vis.
" - svar ikke accepteret, jeg kan jo ikke bruge det til noget. Jeg lader ement stå åbent lidt, hvis der skulle komme nogle flere ideer.

Hvis jeg starter programmet på følgende måde:

rt.exec("cmd /c "+path); (win32)

kommer samme exception: EXCEPTION_ACCESS_VIOLATION (som resulterer i rigtig mange søgeresultater på google)

Forskellen er, at JVM skriver hvad årsagen er. Årsagen har noget at gøre Graphics2D klassen i AWT. Det er en bug Sun selv har skrevet skulle være fixet fra JDK 1.4.0, men det er den åbenbart ikke.

Java har bare sine begrænsinger...
Avatar billede dsj Nybegynder
15. august 2002 - 22:33 #7
Nåh, jeg har fundet ud af følgende:

det er en MEGET normal bug under 1.4.0_01, som er den nyeste (og alle andre 1.4.*).
JVM crasher simpelthen når en hvilken som helst application går i Fullscreen.

Løsning kør JDK 1.3.* i stedet !!
Avatar billede dsj Nybegynder
15. august 2002 - 22:34 #8
Det er da utroligt at jeg ofte må acceptere mine egne svar (ryster lidt på hovedet)
Avatar billede emileej Nybegynder
15. august 2002 - 22:37 #9
Det er dog utrolig at du ikke kan acceptere andres korrekte svar (ryster oss på hovedet)
Avatar billede dsj Nybegynder
16. august 2002 - 07:03 #10
hehe det var ikke for at genere nogen, men det da lige nemt nok at svare det samme som der stod i spørgsmålet
Avatar billede emileej Nybegynder
16. august 2002 - 08:41 #11
Jeg ser ikke hvor der i spørgsmålet står at du har prøvet at køre programmet i en seperat tråd...

E-)mil
Avatar billede emileej Nybegynder
16. august 2002 - 08:42 #12
Men lad det nu ligge - hovedsagen er at du har fået svar på dit spørgsmål, og så er det jo overstået.
Avatar billede dsj Nybegynder
16. august 2002 - 13:01 #13
Puttes det i en tråd for sig selv, hvor jeg også skriver "proc.waitFor()" ...

:)
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