Programm Beenden und alles Schließen

Serethos

Erfahrenes Mitglied
Servus hab da ein kleines Porblem mit mein Programmchen.

Wenn ich ein CommPort auf habe und dann mein Programm schließen möchte geht nur das Frame zu aber in Eclipse läuft es noch. Muss es dann über den Roten Button ausschalten.
Hier so sieht mein Prog.Code aus

public Root() {
super();
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
System.runFinalizersOnExit(true);
}
/**
*Mein Destruktor
*/
protected void finalize(){
portaus.stop();
System.out.println("ENDE");
}

Hab gedacht mit einen Destrukter bekomme ich das hin und kann dann mein Thread mit portaus.stop(); beenden aber das geht ja nur wenn der Garbage Collector irgendwann aufgerufen wird und der dann mein Destruktor started.

Hat jemand vieleicht ein andere Idea wie ich Mein Prog schließen kann und am ende mein Thread stopen kann damit es aus geht

Danke schon mal.
 
Hallo!

tausch doch einfach:
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
durch
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Gruß Tom
 
Servus

hab deins mal versucht aber irgendwie bekomme ich edliche fehler und irgendeine seltsame ausgabe.



Fehler:

WaitCommEvent: Error 6
WaitCommEvent: ErrENDE

An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x7800F516 during VM shutdown
Function=setvbuf+0x24B
Library=C:\WINNT\system32\MSVCRT.dll

Current Java thread:
at com.sun.comm.Win32SerialPort.waitForEvent(Native Method)
at com.sun.comm.NotificationThread.run(Win32SerialPort.java:829)

Dynamic libraries:
0x00400000 - 0x00406000 C:\Programme\Java\j2re1.4.1_01\bin\javaw.exe
0x77880000 - 0x77903000 C:\WINNT\system32\ntdll.dll
0x79350000 - 0x793B2000 C:\WINNT\system32\ADVAPI32.dll
0x77E70000 - 0x77F35000 C:\WINNT\system32\KERNEL32.DLL
0x77D20000 - 0x77D91000 C:\WINNT\system32\RPCRT4.DLL
0x77E00000 - 0x77E65000 C:\WINNT\system32\USER32.dll
0x77F40000 - 0x77F7E000 C:\WINNT\system32\GDI32.DLL
0x78000000 - 0x78045000 C:\WINNT\system32\MSVCRT.dll
0x6D330000 - 0x6D45A000 C:\Programme\Java\j2re1.4.1_01\bin\client\jvm.dll
0x77540000 - 0x77571000 C:\WINNT\system32\WINMM.dll
0x6D1D0000 - 0x6D1D7000 C:\Programme\Java\j2re1.4.1_01\bin\hpi.dll
0x6D300000 - 0x6D30D000 C:\Programme\Java\j2re1.4.1_01\bin\verify.dll
0x6D210000 - 0x6D229000 C:\Programme\Java\j2re1.4.1_01\bin\java.dll
0x6D320000 - 0x6D32D000 C:\Programme\Java\j2re1.4.1_01\bin\zip.dll
0x6D000000 - 0x6D0FB000 C:\Programme\Java\j2re1.4.1_01\bin\awt.dll
0x777F0000 - 0x7780E000 C:\WINNT\system32\WINSPOOL.DRV
0x782F0000 - 0x78300000 C:\WINNT\system32\MPR.DLL
0x75DF0000 - 0x75E0A000 C:\WINNT\system32\IMM32.dll
0x77A40000 - 0x77B2F000 C:\WINNT\system32\ole32.dll
0x6E330000 - 0x6E336000 C:\WINNT\system32\INDICDLL.dll
0x6D180000 - 0x6D1D0000 C:\Programme\Java\j2re1.4.1_01\bin\fontmanager.dll
0x51000000 - 0x51047000 C:\WINNT\system32\ddraw.dll
0x72810000 - 0x72816000 C:\WINNT\system32\DCIMAN32.dll
0x72D90000 - 0x72E03000 C:\WINNT\system32\D3DIM.DLL
0x6D280000 - 0x6D29E000 C:\Programme\Java\j2re1.4.1_01\bin\jpeg.dll
0x6D2D0000 - 0x6D2DE000 C:\Programme\Java\j2re1.4.1_01\bin\net.dll
0x74FC0000 - 0x74FC9000 C:\WINNT\system32\WSOCK32.dll
0x74FA0000 - 0x74FB4000 C:\WINNT\system32\WS2_32.DLL
0x74F90000 - 0x74F98000 C:\WINNT\system32\WS2HELP.DLL
0x77830000 - 0x7783C000 C:\WINNT\System32\rnr20.dll
0x77970000 - 0x77994000 C:\WINNT\system32\DNSAPI.DLL
0x77310000 - 0x77323000 C:\WINNT\system32\iphlpapi.dll
0x774F0000 - 0x774F5000 C:\WINNT\system32\ICMP.DLL
0x772F0000 - 0x77307000 C:\WINNT\system32\MPRAPI.DLL
0x750C0000 - 0x750CF000 C:\WINNT\system32\SAMLIB.DLL
0x750E0000 - 0x7512F000 C:\WINNT\system32\NETAPI32.DLL
0x79430000 - 0x7943F000 C:\WINNT\system32\Secur32.dll
0x77BE0000 - 0x77BF1000 C:\WINNT\system32\NTDSAPI.dll
0x77940000 - 0x7796B000 C:\WINNT\system32\WLDAP32.DLL
0x75130000 - 0x75136000 C:\WINNT\system32\NETRAP.dll
0x779A0000 - 0x77A3B000 C:\WINNT\system32\OLEAUT32.DLL
0x77380000 - 0x773B0000 C:\WINNT\system32\ACTIVEDS.DLL
0x77350000 - 0x77373000 C:\WINNT\system32\ADSLDPC.DLL
0x77820000 - 0x7782E000 C:\WINNT\system32\RTUTILS.DLL
0x78310000 - 0x783A1000 C:\WINNT\system32\SETUPAPI.DLL
0x791A0000 - 0x79202000 C:\WINNT\system32\USERENV.DLL
0x774B0000 - 0x774E3000 C:\WINNT\system32\RASAPI32.DLL
0x77490000 - 0x774A1000 C:\WINNT\system32\RASMAN.DLL
0x77500000 - 0x77522000 C:\WINNT\system32\TAPI32.DLL
0x71710000 - 0x71794000 C:\WINNT\system32\COMCTL32.DLL
0x70A70000 - 0x70AD5000 C:\WINNT\system32\SHLWAPI.DLL
0x77330000 - 0x77349000 C:\WINNT\system32\DHCPCSVC.DLL
0x777D0000 - 0x777D8000 C:\WINNT\System32\winrnr.dll
0x777E0000 - 0x777E5000 C:\WINNT\system32\rasadhlp.dll
0x74F40000 - 0x74F5E000 C:\WINNT\system32\msafd.dll
0x74F80000 - 0x74F87000 C:\WINNT\System32\wshtcpip.dll
0x77910000 - 0x77933000 C:\WINNT\system32\imagehlp.dll
0x72970000 - 0x7299D000 C:\WINNT\system32\DBGHELP.dll
0x68F30000 - 0x68F3B000 C:\WINNT\system32\PSAPI.DLL

Local Time = Thu Feb 24 13:13:26 2005
Elapsed Time = 33
#
# The exception above was detected in native code outside the VM
#
# Java VM: Java HotSpot(TM) Client VM (1.4.1_01-b01 mixed mode)
#
 
Kannst du nicht einfach den Comm-Port vor dem Programmabschluss freigeben ? Daran wirds liegen oder ?
 
Hallo!

... okay jetzt seh ich was du machen willst... man sollte die Beiträge auch bis zum Ende lesen...

... shutdownHook to the Rescue :)
Code:
/*
 * Created on 24.02.2005
 *
 */
package de.tutorials;

/**
 * @author TDarimont
 */
public class ShutdownHookExample {

	static Thread shutdownThread = new Thread() {
		public void run() {
			System.out.println("some last Action...");
		}
	};

	public static void main(String[] args) {
		Runtime.getRuntime().addShutdownHook(shutdownThread);

		for (int i = 0; i < 100; i++) {
			System.out.println(i);
		}
	}
}

Gruß Tom
 
Servus

hab das jetzt hier in mein destrukter reingeschrieben
Runtime.getRuntime().addShutdownHook(Trans.portaus.runner);

runner = mein Thread

aber irgendwie passiert nix oder sollte ich diesen befehl wo anders hin schreiben?
 
Hallo!

In Java sollte man sich nie auf das Aufrufen eines finalisers verlassen geschweige denn Code dort hinterlegen. Vom Java Laufzeitsystem wird nämlich nicht garantiert, dass die finalize Methode jemals aufgerufen wird.....

Den shutdownHook setzt du am besten beim Starten deiner Anwendung.

Gruß Tom
 
Servus

hab das in mein Konstruktor geschrieben

Runtime.getRuntime().addShutdownHook(Trans.portaus.runner);

aber dadurch bekomme ich ne NULLPOINTER Exception.
 
Hallo!

Dann hast du Trans.portaus.runner vor dem betretetn dieses Kontextes wohl noch nicht initialisiert...-> ist null. Das solltest du ändern.

Gruß Tom
 
Servus

Hab meinen runner jetzt initialisiert aber jetzt geht mein Programm immer noch ned zu.


Was macht die funktion eigentlich Runtime.getRuntime().addShutdownHook(Trans.portaus.runner);

führt der die Funktion stop() für den Thread aus.

denn ich muss doch immer mein seriellen port schließen wenn ich das Programm schließe
serialPort.close();
 
Zurück