SerialPort auslesen und Daten verarbeiten

richiking

Mitglied
Hallo,

ich arbeite derzeit an einem Projekt bei dem über Bluetooth Daten gesendet werden. Ich lese die virtuelle serielle Schnittstelle aus und will die Daten verarbeiten.
Die Daten kommen dabei immer wiefolgt an: [85, -1, 24,x0,x2,x3...x23]

Wobei die ersten 3 Stellen immer einem Header entsprechen den ich nicht weiter benötige...

Ich suche also nach den 3 Stellen in meinem SerialRingBuffer (siehe Code) und merke mir wo sie stehen... lese dann die Daten aus und lösche den Buffer bis hin zum neuen Header....

Sprich: nach dem ersten Durchlauf sollte i immer 0 bleiben, da ich ja den Buffer genau so lösche dass der Header wieder an stelle 0 steht...

Mein problem... das funktioniert auch hin und wieder... nur fängt er dann an, den header bei 26 oder 50 oder sonst irgendwo zu finden. Die Daten die von Bluetooth her kommen sind als korrekt anzusehen, da ichs mit dem Hyperterminal probiert habe und dort funktioniert....

Hier mal Code:

Java:
InputStream in;
        SerialPort sport;
    	static boolean headerfound= false;
    	
    	
    	byte[] buffer = new byte[4000];
    	
    	ArrayList fin = new ArrayList();
    	byte[] realdata = new byte[24];



    	byte[] header = {85,-1,24};
    	String out="";
    	StringBuffer serialRingBuffer = new StringBuffer();

    	
        public ComRW ( InputStream in, SerialPort sp )
        {
            this.in = in;
            this.sport=sp;
        }
        
        private void parsedata()
        {

    			try {
    				in.read(buffer);
    				serialRingBuffer.append(new String(buffer).trim());
    				
    				
				} catch (IOException e) {

					e.printStackTrace();
				}
    			
    			
					


    			int i=0;

    			
    			while(!headerfound && serialRingBuffer.length()>=3 && i<serialRingBuffer.length())
    			{
    				
    				if(serialRingBuffer.toString().getBytes()[i]==header[0]&&serialRingBuffer.toString().getBytes()[i+1]==header[1]&&serialRingBuffer.toString().getBytes()[i+2]==header[2])
    				{
    					System.out.println("Header beginnt bei: "+i+"\r\n"); 
    					headerfound=true;
    				}
    				i++;
    				
    			}
    			i--;
    			String outtemp="";		
    			if(i+26<serialRingBuffer.length()&&headerfound)
    			{
    				
    				for(int s=0;s<24;s++)
    				{    						
    					realdata[s]=serialRingBuffer.toString().getBytes()[i+s+3];
    					outtemp = outtemp+realdata[s]+", ";

    				}
    				out = out+outtemp+", ";
    				fin.add(realdata);
    				System.out.println(outtemp);
    				

    				serialRingBuffer.delete(0, i+27);

    			}
    			
    			else if(!headerfound)
    			{
    				serialRingBuffer.delete(0, serialRingBuffer.length()+1);

    			}

    	    	headerfound=false;

	
    		}

Und hier noch der Thread-Sleep...

Java:
public void run ()
        {
 
                while (true)
                {
                		
                		parsedata();
                		try{
                			Thread.sleep(5);
                		}
                		catch (Exception e) {
					// TODO Auto-generated catch block
                			e.printStackTrace();
                		}
                		
}

Bitte um Hilfe, ärgere mich schon seit Tagen damit herum. Falls noch zusätzliche Infos benötigt werden bitte Bescheid sagen!

lg, richi
 

tagedieb

Top Contributor
Auf ein Schuss ins Blaue würd ich sagen es liegt am StringBuffer!!

Ein String sind encodete Bytes. Das heisst je nach Encoding werden die Bytes umgewandelt und dementsprechend wird auch deine Suche ein falsches ergebnis zurueckliefert.

Du darfst keine Stringumwandlung verwenden, da deine Daten (zumindest der Header) kein String ist.
Du sollest ein Byte Array oder den ByteBuffer aus dem java.nio Package.
 

richiking

Mitglied
Das komische ist ja nur, dass es größtenteils funktioniert aber dann auf einmal bei stelle 11 im array scheinbar der header auftritt anstatt an stelle 0.... es scheint also als würden sich die 26 byte (od. 27 weiß grad nicht genau) verschieben bzw. als würde ich falsch abschneiden... was ich allerdings schon mehrmals geprüft hätte...
 

richiking

Mitglied
Problem ist ja auch noch, dass der ByteBuffer eine fixe Größe hat oder täusch ich mich?

Ich weiß aber nicht wieviele Daten (hängt von der Laufzeit ab) produziert werden...
 

tagedieb

Top Contributor
Du darfst mir schon glauben wenn ich sage chars (16 bit) sind keine bytes (8 bit). Bei der Umwandlung von bytes in einen String spielt auch das Encoding (UTF-8, ISO0-8859-1) eine Rolle. Da werden bytes geaender, eingefuegt oder rausgeloescht (siehe Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)).

Der ByteBuffer hat eine limitierte Groesse. Du darfst eben nur soviele bytes lesen wie du auch in den Buffer schreiben kannst. Wenn du einen Record verarbeitet hast rufst du buffer.compact() ByteBuffer (Java 2 Platform SE 5.0) auf, damit werden die verarbeiteten Bytes geloescht und es hat wieder Platz fuer neue Daten.

Du brauchst den ByteBuffer ja nicht verwenden wenn du nicht will, aber eine Umwandlung in einen String ist definitiv falsch!
 

richiking

Mitglied
Das glaub ich dir auch, ich finde es nur seltsam dass es, wenn ichs im Debugger ausführe (fast) zu 100% funktioniert, nur wenn ichs normal laufen lasse eben nicht.

Du scheinst ja eine Idee zu haben wie ich das ändern kann. Kannst du mir vl. ein paar Codefetzen als anhaltspunkt geben, da ich nun doch schon ziemlich am verzweifeln bin.

lg, richi
 

tagedieb

Top Contributor
Du hast da uebrigens noch einen logischen Fehler im Code. In der parsedata Methode liest du bis zu 4000 Bytes ein (Buffergroesse), aber du parst maximal 1 Datensatz. In den 4000 Bytes koennen natuerlich mehrere Datensaetze vorkommen, aber es wird nur 1 Datensatz geparst. Oder aus dem Inputstream werden auch nicht komplette Datensaetze ausgelesen und in den Buffer geschrieben. Da du jedes mal wieder den Buffer ueberschreibst und nicht die restlichen Daten zusammenfuegst gehen diese Daten verloren.

Am einfachsten ist dir wohl geholfen, wenn du einen BufferdInputStream verwendest und keinen eigenen Buffer verwendest. Du liest dann die Bytes direkt aus dem Stream (blockiert aber, wenn du mehr Zeichen ausliest als im Stream verfuegbar sind)

Ich habe mal ein Beispiel mit java.nio und ByteBuffer (non Blocking) gemacht.

Java:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class RecordReader {
	private ReadableByteChannel in;
	private ByteBuffer buffer = ByteBuffer.allocate(8192);
	private byte[] header = { 85, -1, 24 };
	List<byte[]> fin = new ArrayList<byte[]>();

	public RecordReader(InputStream is) {
		in = Channels.newChannel(is);
	}

	public void parsedata() {

		byte[] realdata = new byte[24];
		byte[] currentHeader = new byte[3];

		try {
			while (true) {
				in.read(buffer);
				buffer.flip();
				while (buffer.hasRemaining()
						&& buffer.remaining() >= (header.length + realdata.length)) {
					buffer.mark();
					byte b = buffer.get();
					if (b == header[0]) {
						buffer.reset();
						buffer.get(currentHeader);
						if (Arrays.equals(header, currentHeader)) {
							buffer.get(realdata);
							System.out.println(new String(realdata));
							fin.add(realdata);
						} else {
							buffer.reset();
							buffer.get();
						}
					}
				}
				buffer.compact();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		byte[] testdata = { 85, -1, 24, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
				65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 65, 66, 67, 68, 69, 70,
				71, 72, 73, 74, 85, -1, 24, 65, 66, 67, 68, 69, 70, 71, 72, 73,
				74, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 65, 66, 67, 68, 69,
				70, 71, 72, 73, 74, 85, -1, 24, 65, 66, 67, 68, 69, 70, 71, 72,
				73, 74, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 65, 66, 67, 68,
				69, 70, 71, 72, 73, 74, 85, -1, 24, 65, 66, 67, 68, 69, 70, 71,
				72, 73, 74, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 65, 66, 67,
				68, 69, 70, 71, 72, 73, 74, 85, -1, 24, 65, 66, 67, 68, 69, 70,
				71, 72, 73, 74, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 65, 66,
				67, 68, 69, 70, 71, 72, 73, 74, 85, 85, -1, 24, 65, 66, 67, 68,
				69, 70, 71, 72, 73, 74, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
				65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 85 };

		ByteArrayInputStream bais = new ByteArrayInputStream(testdata);
		new RecordReader(bais).parsedata();
	}
}
 

richiking

Mitglied
Vielen lieben Dank!
Das sieht sehr vielversprechend aus. Ich verstehe zwar noch nicht alle Methoden/Befehle die du verwendest aber das werd ich mir schon noch genauer anschauen.... das einzige Problem dass ich jetzt noch habe ist, dass die Ausgabe in der Konsole jetzt natürlich in ASCII-Format erfolgt. Ich will allerdings ganz gerne die repräsentativen Zahlenwerte sehen (wie in deinen Testdaten)... Hab schon ein paar Sachen durchprobiert aber bin noch auf keinen grünen Zweig gekommen. Vielleicht hast du da ja noch eine Idee, wäre toll...


lg, richi


PS: Hat sich erledigt danke...
 
Zuletzt bearbeitet:

richiking

Mitglied
Ok, es sieht jetzt folgendermaßen aus...

Aufgerufen wird das ganze so:

Java:
 l = new Thread(new forum(vc_l.getinstream()));
		        l.start();

Und der Einlese-Code:

Java:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class forum implements Runnable {
    private ReadableByteChannel in;
    private ByteBuffer buffer = ByteBuffer.allocate(8192);
    private byte[] header = { 85, -1, 24 };
    List<byte[]> fin = new ArrayList<byte[]>();

 
    public forum(InputStream is) {
        in = Channels.newChannel(is);
    }
 
    public void parsedata() {
 
        byte[] realdata = new byte[24];
        byte[] currentHeader = new byte[3];
 
        try {
            while (true) {
                in.read(buffer);
                buffer.flip();
                while (buffer.hasRemaining()
                        && buffer.remaining() >= (header.length + realdata.length)) {
                    buffer.mark();
                    byte b = buffer.get();
                    if (b == header[0]) {
                        buffer.reset();
                        buffer.get(currentHeader);
                        if (Arrays.equals(header, currentHeader)) 
                        {
                            buffer.get(realdata);  
                            System.out.println(Arrays.toString(realdata));
                            fin.add(realdata);
                            
                        } 
                        else 
                        {
                            buffer.reset();
                            buffer.get();
                        }
                    }
                }
                buffer.compact();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void run ()
    {

            while (true)
            {
            		
            		parsedata();
            		try{
            			Thread.sleep(5);
            		}
            		catch (Exception e) {
				// TODO Auto-generated catch block
            			e.printStackTrace();
            		}            		            			            
            }
    }
}


Die Ausgabe ist folgende:

Java:
[103, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, -4, -1, -52, -1, -19, -1]
[104, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, -86, -1, -1, -2, -114, -1]
[104, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 124, 85, -1, 24, 104, 5]
[104, 5, 1, 0, -1, 125, -2, 78, -1, 35, 85, -1, 24, 104, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5]
[104, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 109, -1, -90, -2, 18, -1]
[104, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, -29, -1, 72, -1, -55, -1]
[105, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 36, 0, 64, 0, 29, 0]
[106, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, -15, -1, -105, -1, -1, 85]
[106, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, -28, 85, -1, 24, 107, 5]
[108, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, -10, -1, -100, -1, -30, -1]
[109, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, -9, -1, -45, -1, -22, -1]
[109, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 0, 0, -69, -1, -1, 24]
[108, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 85, -22, -1, 85, 85, -1, 24, 110, 5, 1, 0, 2]
[111, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 85, -1, 24, 112, 5, 1, 0, 2, 0, 3, 0]
[111, 5, 1, 0, 2, 0, 3, 0, 0, 7, 0, 8, 0, 9, 0, -42, -1, 1, 0, 38, 0, 85, -1, 24]
[113, 5, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 49, 0, 125, 0, 42, 0]
... (usw...)
...
...
[code=Java]

Wie man sieht, steht der Header in der Ausgabe mit drin, was ja eigentlich nicht sein dürfte.... das Problem hatte ich mit meiner Version auch immer... es scheint sich etwas zu verschieben, oder liegt das wieder am Encoding?! Wie kann ich das dann lösen?

Hoffe ich nerv damit nicht schon, aber es ist ein ziemlich wichtiges Projekt für mich...

Danke schonmal für die großartige Hilfe bis jetzt!
 

tagedieb

Top Contributor
Bist du sicher, dass alle Records 27 byte lang sind? Eventuell gibt es auch kuerzere Records?

Anonsten wuerd ich mal alles ausgeben was aus dem InputStream kommt und ueberpruefen ob da auch alles so gestreamt wird wie du das erwartest (even fixe Recordlaenge).

Ausserdem musst du aufpassen mit der parsedata Methode. Im moment laeuft die unendlich, ausser es wird eine exception geworfen. Dein
PHP:
Thread.sleep(5);
wird gar nie durchlaufen werden.
 

richiking

Mitglied
Sodala,
hab jetzt folgendes verändert...

Java:
while(true)

zu

Java:
while (in.read(buffer)>0)


habs jetzt mehrere Male ausprobiert und es scheint zu funktionieren. Vielen vielen vielen Dank!!! :applaus:
 

richiking

Mitglied
So nach langem Hin- und Her stehe ich wieder vor einem Problem...

Der ReadablyByteChannel scheint mir zu blockieren falls von der seriellen Schnittstelle nichts mehr ankommt...

Frage: Kann man dies verhindern?
 

tagedieb

Top Contributor
Wie soll man etwas verhindern was nur scheinbar auftritt? :D

Hast du ein Beispiel wo du das Problem reproduzieren kannst? Kannst du die letzte Version deines Codes hochladen?
 
S

Spacerat

Gast
Natürlich blockiert er... warum auch nicht, ist normal für Datenempfänger. Zum Beenden eines Empfängerthreads vom Sender aus wird ein "Hang up"-Signal benötigt. Auf der Empfängerseite kann man aber auch mit einem Timeout arbeiten.
 

richiking

Mitglied
Ja es ist mir auch klar dass er blockiert... hab meine frage vielleich blöd gestellt...

aber wie kann ich ihm sagen er soll den thread dann beenden wenn nichts mehr ankommt?
 
S

Spacerat

Gast
Das kann man auf verschiedene Weise regeln, in jedem Fall wird ein weiterer Thread benötigt, welcher den anderen (blockierten) Thread nach einer gewissen Zeit beendet (abwürgen wäre hier eigentlich der bessere Begriff) weil dieser nicht die Zeit seiner letzten Aktivität melden konnte.
 

richiking

Mitglied
Also... der Code entspricht dem zuletzt gepostetem Code...

Ich habe jetzt folgendes versucht:

Thread A: Daten auslesen (in.read(buffer))....

In der Klasse die der Thread A bedient wird eine boolean Variable true gesetzt nach jedem erfolgreichem einlesen und bleibt false falls in.read() blockiert. Weiters habe ich eine get-Methode für jene Boolean Variable implementiert.

In Thread B rufe ich immer wieder diese Methode auf und überprüfe ob true... falls nicht mache ich ein Thread A.sleep für ein paar millisekunden... und wenn die methode dann wieder false zurückliefert dann stoppe ich den Thread A...

Jetzt habe ich allerdings das Problem, dass Thread A durch dies sehr langsam geworden ist und hinterherhängt...

CODE Thread B:

Java:
public class Checkport implements Runnable {
	
	Thread th;
	Data vd;
	
	public Checkport(Thread t, Data d)
	{
		th=t;
		vd=d;
	}
	
	public void run()
	{
		while(true)
		{
			if(!vd.checkRunning())
			{
				try {
					th.sleep(10);
					
					if(!vd.checkRunning())
					{
						th.stop();
						System.out.println("Alles Kaputt");
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			
			else
			{
				System.out.println("OK");
			}
		}
	}

CODE Thread A:

Java:
boolean isrunning = true;

try {
isrunning = false;
            while (in.read(buffer)>0) 
            {
isrunning = true;
            	
                buffer.flip();
               
                while (buffer.hasRemaining()
                        && buffer.remaining() >= (header.length + realdata.length)) {
                    buffer.mark();
                    byte b = buffer.get();
                   
                    if (b == header[0]) 
                    {
                        buffer.reset();                                               
                        buffer.get(currentHeader);
                        
                        if (Arrays.equals(header, currentHeader)) 
                        {
                        	realdata = new byte[size_data];
                            buffer.get(realdata);  
                            System.out.println(Arrays.toString(realdata));       // Print ohne Parsen                     
                            fin.add(realdata);
                            

                             
                        else 
                        {
                            buffer.reset();
                            buffer.get();
                        }
                    }
                }
                buffer.compact();
            }
            

            
        } catch (IOException e) {
            e.printStackTrace();
        }
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Eigentlich ist so ein TimeOut-Thread relativ simpel zu realisieren.
Java:
public class TimeOutWatchDog
{
	private static final long TIMEOUT = 5000L;

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		ReaderThread r = new ReaderThread();
		TimerThread  t = new TimerThread(r, TIMEOUT);
		r.start();
		t.start();
	}

	private static final class ReaderThread
	extends Thread
	{
		private long lastActivity;
		private boolean running;

		private ReaderThread()
		{
			super("reader");
		}

		@Override
		public synchronized void start()
		{
			running = true;
			super.start();
		}

		@Override
		public boolean isInterrupted()
		{
			return !running;
		}

		@Override
		public void interrupt()
		{
			running = false;
		}

		@Override
		public void run()
		{
			while(!isInterrupted()) {
				// diese Zeit muss bei jedem Durchlauf erneuert werden.
				lastActivity = System.currentTimeMillis();
				synchronized(this) {
					// Simulation des Lesevorganges ganz simpel
					try {
						wait((long) (Math.random() * TIMEOUT * 2) + 10L);
					} catch(InterruptedException e) {
						// interrupt();
					}
				}
			}
			System.out.println("now I'm kicked :(");
		}

		public long getLastActivity()
		{
			return lastActivity;
		}
	}

	private static final class TimerThread
	extends Thread
	{
		private final ReaderThread reader;
		private final long timeOut;

		private TimerThread(ReaderThread source, long timeOut)
		{
			super("timer");
			if(source == null) {
				throw new IllegalArgumentException("source may not be null");
			}
			if(timeOut < 20L) {
				throw new IllegalArgumentException("timeOut may not be smaller than 20");
			}
			this.timeOut = timeOut;
			this.reader = source;
		}

		@Override
		public void interrupt()
		{
			reader.interrupt();
			try {
				reader.join();
			} catch(InterruptedException e) {
				// interrupt();
			}
			super.interrupt();
		}

		@Override
		public void run()
		{
			long lastActivity, currentTime;
			while(!isInterrupted()) {
				synchronized(this) {
					try {
						wait(timeOut / 2);
					} catch(InterruptedException e) {
						// interrupt();
					}
				}
				lastActivity = reader.getLastActivity();
				currentTime = System.currentTimeMillis();
				System.out.println(currentTime - lastActivity);
				if(currentTime - lastActivity > timeOut) {
					interrupt();
				}
			}
			System.out.println("nothing to watch at.");
		}
	}
}
Erstens ist es hier wichtig, dass der Lesethread kurz vor dem Timeoutthread (also scheinbar gleichzeitig) gestartet wird, weil letzterer nur eine Timerperiode auf den Lesethread wartet und sich dann beendet. Die Art, wie der Lesethread hier beendet werden soll (durch einen anderen Thread) macht es in vielen Fällen erforderlich (sicherer), dass [c]isInterrupted()[/c], [c]interrupt()[/c] und [c]start()[/c] wie gezeigt überschrieben werden, damit wird im Zweifelsfall ein Deadlock verhindert.
 
Zuletzt bearbeitet von einem Moderator:

richiking

Mitglied
Ok habe es ausprobiert mit Ihrer/deiner Lösung, doch leider gibt mir die Konsole nach Start der beiden Threads augenblicklich "now i'm kicked" aus...

ohne code ws. keine fehlerbehebung möglich right?
 
S

Spacerat

Gast
Wie augenblicklich? Also mein Beispiel ist wirklich nur ein KSKB, welches erst nach 5000 Millisekunden zum ersten Mal die Möglichkeit bekommt, auszusteigen. Das liegt an der TIMEOUT-Konstante.
Der Reader schläft pro Durchlauf in Zeitspannen zwischen 10 und 10000 (2*TIMEOUT) Millisekunden.
Der Timer fragt alle 2500 Millisekunden den Zeitpunkt der letzten Aktivität des Readers ab. Wenn dieser Zeitpunkt TIMEOUT überschreitet, wird der Reader unterbrochen ("now I'm kicked :(") und der Timer beendet sich selbst ("nothing to watch at.").
Natürlich muss TIMEOUT und die "run()"-Methode des Readers deinen Ansprüchen nach angepasst werden und dessen Sleep-Time sollte keineswegs, wenn überhaupt eine benötigt wird, zufällig ermittelt werden. Nur das update der "lastActivity" ist wichtig.
 

richiking

Mitglied
Ähm direkt nach Start der beiden Threads...


ABER, egal... ich hab jetzt das vorgeschlagene script etwas erleichtert damit ich es auch versteh und frage jetzt einfach jede sekunde ab ob die lastactivity + der timeout zeit < der aktuellen systemzeit ist...

und das scheint jetzt zu funktionieren... danke!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T SerialPort in c in Java umsetzen Allgemeine Java-Themen 2
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
B SerialPort Kommunikation - Pufferüberlauf Allgemeine Java-Themen 6
M SerialPort RS232 : java.lang.NoSuchFieldError: eis Allgemeine Java-Themen 2
E Properties +SerialPort Allgemeine Java-Themen 9
N SerialPort Programm Allgemeine Java-Themen 4
L Input/Output Email mit großer Pdf Anhang auslesen? Allgemeine Java-Themen 6
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
S .exe Datei/Programm auslesen? Allgemeine Java-Themen 2
T INI - Einträge auslesen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
O PDF auslesen und verändern, was ist besser iText oder PDFBox ? Allgemeine Java-Themen 9
Robertop Status von Caps- und NumLock auslesen Allgemeine Java-Themen 1
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
G Mac Package auslesen Allgemeine Java-Themen 17
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
M verschiedene Dokumente auslesen Allgemeine Java-Themen 1
Gaudimagspam CSV-Datei auslesen in Java Allgemeine Java-Themen 7
L Dateien richtig auslesen Allgemeine Java-Themen 6
F WireGuard Status auslesen Allgemeine Java-Themen 3
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
I DOM-Parser - Element im Element an bestimmten Stellen auslesen Allgemeine Java-Themen 1
N Txt Datei auslesen. Allgemeine Java-Themen 5
O xlsx Datei auslesen mit POI Apache liest keine LEERZELLEN Allgemeine Java-Themen 6
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
E CSV mit Text und Binärdaten auslesen Allgemeine Java-Themen 7
x46 Webseite in Java auslesen Allgemeine Java-Themen 2
M Html Seite auslesen Allgemeine Java-Themen 16
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
B Cookie auslesen Allgemeine Java-Themen 3
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
J Teil einer URL auslesen Allgemeine Java-Themen 13
denny86 NetBeans Ordnernamen rekursiv auslesen und in Variable verarbeiten Allgemeine Java-Themen 38
C Atfx mit Hilfe von OpenAtfx auslesen Allgemeine Java-Themen 1
C Position von Pixeln in Bilder auslesen Allgemeine Java-Themen 2
M aktive WLAN Teilnehmer auslesen? Allgemeine Java-Themen 6
X JSONObject auslesen und in HashMap hinterlegen Allgemeine Java-Themen 16
S Kann man mit Java auf einem lokalen PC/Mac Benutzergruppen auslesen und Rechte ändern? Allgemeine Java-Themen 11
C Webseite auslesen Allgemeine Java-Themen 3
D Best Practice Gesamten Bildschirminhalt auslesen und Email schicken sobald kein Pixel sich ändert Allgemeine Java-Themen 11
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
J Bestimmte Zeile aus Textdatei auslesen Allgemeine Java-Themen 18
G Aus JTextField Zahlen auslesen und random generieren Allgemeine Java-Themen 10
M Tastatureingabe von Sondertasten auslesen Allgemeine Java-Themen 6
C Auslesen auslösen über Button-Click Allgemeine Java-Themen 8
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
4a61766120617274697374 PDF iText Wort Koordinaten auslesen Allgemeine Java-Themen 1
KeVoZ_ Bestimmte Zeile aus Console finden & auslesen Allgemeine Java-Themen 2
T Url aus txt Datei auslesen und öffnen? Allgemeine Java-Themen 4
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
KeVoZ_ Properties mit String auslesen Allgemeine Java-Themen 11
I HTML einer Website auslesen liefert nur head Allgemeine Java-Themen 6
D Aktuell installierte Java Version auslesen unter Windows Allgemeine Java-Themen 5
M Parameter auslesen im Servlet Allgemeine Java-Themen 0
M Input/Output USB Geräteinstanzkennung auslesen Allgemeine Java-Themen 3
W 2D-Grafik Erstellungsdatum JPG direkt aus Header (EXIF) auslesen. Allgemeine Java-Themen 5
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
T Datei Byteweise auslesen Allgemeine Java-Themen 1
T Datentypen MNIST Datenbank auslesen (.gz) Allgemeine Java-Themen 0
T Ini Datei auslesen Allgemeine Java-Themen 3
J Temperatur aus bytes auslesen. Allgemeine Java-Themen 13
I JSoup Class auslesen Allgemeine Java-Themen 1
Bluedaishi Textdateien auslesen Allgemeine Java-Themen 12
T ELM327 OBD2 auslesen Allgemeine Java-Themen 0
D Double aus String auslesen Allgemeine Java-Themen 8
Z Zahlen aus Bild auslesen Allgemeine Java-Themen 1
A interaktives PDF auslesen/auswerten? Allgemeine Java-Themen 0
G Daten aus Website auslesen Allgemeine Java-Themen 7
S CSV Eintrag der nächsten Zeile auslesen funktioniert nicht Allgemeine Java-Themen 8
I Java FX JsonObjekt Children auslesen Allgemeine Java-Themen 23
M RXTX Details auslesen Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
J Wav-Datei aus .jar auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
D CSV Datei auslesen Allgemeine Java-Themen 23
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
J Java JSON-Datei aus .Zip auslesen und Download mit Progress Bar Allgemeine Java-Themen 20
V Tooltips mit Java auslesen Allgemeine Java-Themen 1
I Inhalt einer Website auslesen Allgemeine Java-Themen 6
A JTable - CellRange auslesen Allgemeine Java-Themen 2
V 2d-Barcodes mit zxing auslesen Allgemeine Java-Themen 2
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
K Website in Programm einbinden und auslesen Allgemeine Java-Themen 2
M Image auslesen Allgemeine Java-Themen 2
S Zahlen aus (String mit zahlen) immer wieder neu auslesen Allgemeine Java-Themen 5
T datei auslesen ind der richtigen reihenfolge Allgemeine Java-Themen 2
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
I Methoden Quellcode auslesen (Refelction o.ä.) Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben