Toon posts:

[java] exe uitvoeren tijdens thread

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb applicatie dat een simulatie uitvoert. Deze simulatie draait in een Thread.

Ik heb in deze applicatie een menuknop zitten dat een help file moet opstarten.
De code hierachter is:
code:
1
2
3
4
5
6
7
8
9
try
{
  Runtime.getRuntime().exec("hh.exe Help.chm");
  anim.yield();  //anim is de thread
}
catch (Exception ex)
{
  System.out.println("Error opening help file");
}


Het probleem is: De helpfile wordt ontiechelijk langzaam geladen of zelfs helemaal niet. Wanneer ik het programma dan sluit, staat de help file meteen in beeld. Wie weet hoe ik dit kan oplossen. Ik weet dat er in Delphi iets is als ProcessMessages (of zoiets), maar weet niet wat dat in Java is. ;)

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Laat je je thread wel eens slapen dmv Thread.sleep()?? Het klinkt een beetje alsof je thread je processor aan het branden is...

Verwijderd

Topicstarter
SWfreak schreef op 17 januari 2003 @ 12:20:
Laat je je thread wel eens slapen dmv Thread.sleep()?? Het klinkt een beetje alsof je thread je processor aan het branden is...
Gebeurt ook wel: zowel een sleep als een wait. Ook als ik deze waarden verhoog wordt het nauwelijks tot niet beter. :(

Verwijderd

Volgens mij moet je de OutputStream van het process uit lezen... en omdat het proces los van je programma draait hoef je de externe applicatie niet in een thread op te starten (uit lezen van de ouputstream is wel handig om in een thread te doen)
Uit de docs:
Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.

maar ik weet het niet zeker

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:02
Wat doe je eigenlijk verder nog meer in die thread??
Ikzelf doe bijna altijd na het starten van een programma waitFor(), dan blijft ie blocked-waiting tot de applicatie die gestart is weer wordt beeindigd.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Executer extends Thread
{
     public Executer()
     {
          start();
     }

     public void run()
     {
          try
          {
               Process p=System.getRuntime().exec("calc.exe");
               p.waitFor();
          }
          catch (Exception e)
          {
               e.printStacktrace(System.err);
          }
     }
}


Dit zorgt er dus voor dat calc.exe wordt gestart, het programma zelf blijft doorlopen, maar dat de nieuwe thread waarin het programma draait stopt.

[ Voor 13% gewijzigd door Jelmer op 17-01-2003 12:48 ]


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Yield() is een statische methode van Thread. En het enige wat het doet is de acteive Thread in runnable state zetten. En dan 1 van de Thread's die in Runnable state is activeren (binnen de JVM). Dat is dezelfde thread als er maar 1 Thread is.

Wat je zou kunnen probreren is de prioriteit van de Thread (of van de JVM ) tijdelijk te verlagen...

Verwijderd

Topicstarter
Jelmer schreef op 17 January 2003 @ 12:47:
Wat doe je eigenlijk verder nog meer in die thread??
Ikzelf doe bijna altijd na het starten van een programma waitFor(), dan blijft ie blocked-waiting tot de applicatie die gestart is weer wordt beeindigd.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Executer extends Thread
{
     public Executer()
     {
          start();
     }

     public void run()
     {
          try
          {
               Process p=System.getRuntime().exec("calc.exe");
               p.waitFor();
          }
          catch (Exception e)
          {
               e.printStacktrace(System.err);
          }
     }
}


Dit zorgt er dus voor dat calc.exe wordt gestart, het programma zelf blijft doorlopen, maar dat de nieuwe thread waarin het programma draait stopt.
Binnen de thread wordt alleen een simulatie uitgevoerd. De helpfile wordt niet in de thread gestart, maar tijdens de thread vandaar dat ik yield() probeerde voor een korte pauze zodat de helpfile kan worden opgestart. Helaas werkt dat dus niet. Wat voor manieren zijn er nog meer om de thread even te laten wachten zodat de exe uitgevoerd kan worden :?

[ Voor 6% gewijzigd door Verwijderd op 18-01-2003 10:33 ]


Verwijderd

Topicstarter
*kick* :)
Pagina: 1