Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen?

VfL_Freak

Top Contributor
Hallo zusammen,

in meiner (Swing-)Anwendung verwende ich einen javax.swing.timer.

ich habe mittlerweile festgestellt, dass ein Abbruch mitten im zugehörigen Code-Block nicht möglich ist. Wenn ich ihn von 'außerhalb' stoppe, werde ja noch alle Aktionen bis zum Ende des Codeblocks ausgeführt, ehe sich der Stop-Aufruf auswirkt (oder anders ausgedrückt: ein timer.stop() verhindert "lediglich" das erneute Ausführen).

Ich habe mir mittlerweile auch mal die API zum TimerTask zu Gemüte geführt, habe es aber so verstanden, dass hier ein timer.cancel() den gleichen Effekt hat, richtig ?

Kennt jemand eine andere Möglichkeit oder einen Trick, dieses Abbrechen zu bewerkstelligen?

Gruß
Klaus
 
Hallo Klaus,

nach meiner Erfahrung funktioniert ein "timer.stop()" auch innerhalb der "actionPreformed" Methode. Könntest du bitte mal deinen Code zeigen?
Gruß,
André
 
Hallo André,

erstmal Danke für Deine Antwort!

Also, der stop-Aufruf (genau genommen soll es eigentlich auf ein restart mit verlängertem Delay rauslaufen) soll ja von außerhalb angestossen werden.

Aber es ist doch eigentlich egal, da sich IMHO sowohl stop als auch restart erst dann auswirken, wenn der aktuelle Durchlauf abgearbeitet ist - sprich: beim nächsten Event, oder nicht ???:L Zumindest entnehme ich das so der API (gleiches gilt ja wohl auch für das cancel beim TimerTask ...)

Hier mal der komplette Code des Timers, ob wohl ich bezweifele, dass Du viel Freude dran haben wirst 😀
Der Delay-Wert TIMER_INTERVALL wird an unterschiedlichsten Stellen in der Anwendung neu berechnet und soll hier im gegebenen Fall unter gewissen Umständen um einen Faktor X verlängert werden (bspw. statt 10 sec.--> 30 sec.)
Dies soll sich aber SOFORT in dem Moment des Setzens auswirken (also eigentlich restart) und nicht erst beim nächsten Durchlauf .....

'ne schmutzige Idee, wäre vlt. eine (boolsche) Variable um die einzelnen Methoden aufrufe, um ggf. den Duchlauf zu beschleunigen!
Allerdings dauert ein Durchlauf im Idealfall eh' nun max. 2 sec. und im Extremfall ca. 6 - 8 sec. :noe:
Java:
  /**
   * Haupt-Zeitschleife, hier werden alle zyklisch ablaufenden Aktionen gestartet
   */
  public Timer MainTimer = new Timer( TIMER_INTERVALL, new ActionListener() 
  {
	  public void actionPerformed( ActionEvent evt ) 
	  {
		  int iStartDelay = MainTimer.getDelay();
		  Date datStart = new Date();
		  System.out.println(">>> START MainTimer-Funktionen um <" +  datStart + ">  DELAY: " + iStartDelay + " <<<<<");
		  
		  if( bIsValidClient ) 
		  {
			  if( !WorkerWorkingStatus.getInstance().isAlarmInProgress() ) 
			  {
				  if( bLoggedIn ) 
				  {
					  byte[] aErg = null;
					  WSRequestGetMasterStatus wsc = new WSRequestGetMasterStatus();
					  aErg = wsc.communicate();
					  if( aErg != null ) 
					  {
						  ProcessThreadData( aErg, aErg.length );  // case (ID_REQ_LCMD_MONGETMASTERSTATUS): 
					  }
					  wsc = null;
				  }
			  }
			  try 
			  {
				  Thread.sleep( TIMEMASTERSTATUS );
			  }
			  catch (InterruptedException ex1) 
			  {
				  return;
			  }
        
			  if( bIsActiveMaster ) 
			  {
				  if( !WorkerAlarmRequestFlag.getInstance().isLocked() ) 
				  {
					  sendMCDClientWorkingMode_FT( IWorkerWorkingStatus.WORKERWORKINGSTATUS_REQUEST, true );
					  if( !bDelayRequest ) 
					  {
						  if( !WorkerWorkingStatus.getInstance().isAlarmInProgress() ) 
						  {
							  SetRequestAlarmPOHButtonsLock( true );
							  byte[] aErg = null;
							  if( (com.gselectronic.worker.status.AlarmGetModeStatus.getInstance().getAlarmGetMode() == com.gselectronic.worker.status.IAlarmGetModeStatus.AGM_DoNothing) && (bLoggedIn)) 
							  {
//								  Date datAlarmSuche = new Date();
//								  System.out.println( ">>> WS:   Start AlarmSuche     um <" + datAlarmSuche + ">" );
								  com.gselectronic.worker.status.AlarmGetModeStatus.getInstance().setAlarmGetMode(com.gselectronic.worker.status.IAlarmGetModeStatus.AGM_Request);
								  WSRequestAlarmTextV2 wsc = new WSRequestAlarmTextV2();
								  aErg = wsc.communicate();		
								  if( aErg != null ) 
								  {
									  ProcessThreadData( aErg, aErg.length ); // case( ID_REQ_LCMD_MONGETALARMV2 ) :
								  }
								  wsc = null;
							  }
							  else 
							  {
								  com.gselectronic.worker.status.AlarmGetModeStatus.getInstance().setAlarmGetMode( com.gselectronic.worker.status.IAlarmGetModeStatus.AGM_DoNothing );
							  }
						  }
					  }
				  }
      			
				  if( !WorkerWorkingStatus.getInstance().isAlarmInProgress() ) 
				  {
					  final String strIP = Config.getInstance().m_strIPColocation;
					  byte[] aErg = null;
					  try 
					  {
						  aErg = ( byte[]) Worker.post(new Task() 
						  {
							  public Object run() throws Exception 
							  {
								  return requestWSServerDateTimeFT( strIP );
							  }
						  });
					  }
					  catch( Exception x ) 
					  {
						  // never thrown
					  }
      					
					  if( aErg != null ) 
					  {
						  ProcessThreadData( aErg, aErg.length ); // case (ID_REQ_CMD_GETSERVERTIMESTR):
					  }
				  }
			  } // if( bIsActiveMaster ) 
			  else 
			  {
				  WorkerWorkingStatus.getInstance().setForcedRelogin( true );
				  mnuPause.doClick();
				  WorkerWorkingStatus.getInstance().setForcedRelogin( false );
				  mnuPause.doClick();
			  }
      			
			  if( bIsInvalidMCDIP ) 
			  {
				  WorkerWorkingStatus.getInstance().setForcedRelogin( true );
				  mnuPause.doClick();
				  WorkerWorkingStatus.getInstance().setForcedRelogin( false );
				  mnuPause.doClick();
				  bIsInvalidMCDIP = false;
			  }

			  if( bRequestReplilistCheck ) 
			  {
				  startStopAusfallMCDCheckTimer( true );

				  boolean bErg = false;
				  byte[] aErg = null;
				  try 
				  {
					  aErg = (byte[]) Worker.post( new Task() 
					  {
						  public Object run() throws Exception 
						  {
							  Date datMCD = new Date();
							  System.out.println( ">>> MCD:  Start ID_REQ_LCMD_MONGETREPLILIST-1 um <" + datMCD + ">" );
							  return requestMCDReplilistFT( "", MCDSOCKETTIMEOUT, false );
						  }
					  });
				  }
				  catch( Exception x ) 
				  { 
					  // never thrown
				  }

				  if( aErg != null ) 
				  {
					  bErg = ProcessThreadData( aErg, aErg.length );  // Aufruf von: PTD_monGetRepliList
				  }
				  else 
				  {
					  bErg = false;
				  }

				  if( USELOOPEDMCDRETRYS ) 
				  {
					  if( !bErg ) 
					  {
						  for( int i = 0; i < (int)(Config.getInstance().m_AUSFALLCHECKFAKTOR - 1); i++ ) 
						  {
							  try 
							  {
								  aErg = (byte[])Worker.post( new Task() 
								  {
									  public Object run() throws Exception 
									  {
										  Date datMCD2 = new Date();
										  System.out.println( ">>> MCD:  Start ID_REQ_LCMD_MONGETREPLILIST-2 um <" + datMCD2 + ">" );
										  return( requestMCDReplilistFT("", MCDSOCKETTIMEOUT, false) );
									  }
								  });
							  }
							  catch( Exception x ) 
							  {
								  // never thrown
							  }
            			
							  if( aErg != null ) 
							  {
								  bErg = ProcessThreadData(aErg, aErg.length);  // Aufruf von: PTD_monGetRepliList
							  }
							  else 
							  {
								  bErg = false;
							  }
							  if (bErg) 
							  {
								  break;
							  }
						  }
					  }
				  } // if( USELOOPEDMCDRETRYS ) 
          
				  if( bErg ) 
				  {
					  requestMCDALSTInfos_FT(true);
				  }
      				
				  bMCDIPisValid = bErg;
				  if( bMCDIPisValid ) 
				  {
					  if( frmCon != null	) 
					  {
						  frmCon.Msg( true, "MCD: Wiederaufruf in " + Config.getInstance().CHECKMCDTIMER_INTERVALL / 1000 + " Sek.\n" );
					  }
					  System.out.println( ">>> MCD:  Wiederaufruf in " + Config.getInstance().CHECKMCDTIMER_INTERVALL / 1000 + " Sek." );
					  bIsInvalidMCDIP = false;
				  }
				  else 
				  {
					  if( frmCon != null ) 
					  {
						  if( Config.getInstance().m_strIPMCD.equals("") ) 
						  {
							  frmCon.Msg( true, "MCD: MCD-Kontakt (IP : " + Config.getInstance().m_strIPMCD + ") fehlgeschlagen\n" );
						  }
					  }
					  System.out.println( ">>> MCD:  MCD-Kontakt (IP : " + Config.getInstance().m_strIPMCD + ") fehlgeschlagen" );
					  Config.getInstance().m_strIPMCD = "";
					  bIsInvalidMCDIP = true;
				  }
				  bRequestReplilistCheck = false;
			  }
		  }

		  iStartDelay = MainTimer.getDelay();
		  Date datEnde = new Date();
		  System.out.println(">>> ENDE  MainTimer-Funktionen um <" +  datEnde + ">  DELAY: " + iStartDelay + " <<<<<\n####################" );
	  } // actionPerformed
  }  ); // Ende MainTimer

Danke und Gruß
Klaus
 
Hallo Klaus,

ich habe das nur mal überflogen: auf den ersten Blick sehe in deinem Code aber keinen MainTimer.stop() oder MainTimer.restart(), was den laufenden Timer mitten in der Ausführung abbrechen würde. Aber vielleicht stehe ich ja auch nur auf dem Schlauch?

Gruß,
André

EDIT: übrigens schreibt man Variablennamen gewöhnlich klein: [c]public Timer mainTimer[/c]
 
Zuletzt bearbeitet:
Hallo André,

ich habe das nur mal überflogen: auf den ersten Blick sehe in deinem Code aber keinen MainTimer.stop() oder MainTimer.restart(), was den laufenden Timer mitten in der Ausführung abbrechen würde. Aber vielleicht stehe ich ja auch nur auf dem Schlauch?
Naja, ich will den Timer ja auch aus anderen Klassen heraus abbrechen. Habe aber festgestellt, dass das auch nicht klappt, da der aktuelle Durchlauf auf jeden Fall bis zum Ende läuft! Erst dann wirkt sich ein Stop-Kommando aus ...


übrigens schreibt man Variablennamen gewöhnlich klein: [c]public Timer mainTimer[/c]
ja, dass sind Altlasten ... 😱

Gruß
Klaus
 
Moin André,

ok, ist vlt. auch noch eine Idee ...
Ich werde mal versuchen, ob sich das über eine Variable steuern läßt 🙂

Danke und Gruß
Klaus
 

Zurück
Oben