Hallo, Ich baue gerade an einer GUI für eine Kommunikation über die serielle Schnittstelle zum schnellen konfigurieren und debuggen. Da ich mich zwar mit Java nicht besonders gut auskenne das Programm aber auch auf dem MAC laufen soll hab ich mich mal dran gesetzt Java einzusetzen. Die Kommunikation habe ich mit der RXTX Lib realisiert was soweit auch funktioniert. Ich kann rausschreiben und lesen. Das haut hin. Auch meine GUI funktioniert soweit, lesen, schreiben Jlists kopieren usw. alles kein Problem. Wie verbinde ich jetzt meine zwei Klassen? SwingWorker ist meiner Meinung nach der falsche Ansatz, so wie ich das sehe ist der für Backgroundaufgaben mit hoher Rechenlast ausgelegt die irgendwann mal ein Ergebniss liefern. Jetzt funktioniert meine Kommunikation natürlich eventbasierend, das heißt doBackground... funktioniert so nicht wirklich. Ideal wäre meiner Meinung nach eine Mailboxklasse mit einem einfachen Lock-Mechanismus. In der GUI hohle ich mir (falls Daten anliegen) jede Sekunde oder sowas meine aktuellen Daten mit getXXX(), der COMPort schreibt mit setXXX(), gelockt wird über ein boolean mittels "newdatardy" oder sowas. Nur wie gebe ich Java bekannt das die beiden Threads auf die selbe Instanz von meiner Mailbox zugreifen können? Oder anders gefragt. Wie synchronisiere ich Threads soweit? Schonmal Danke Michael
Am besten löst du das über Events. Ich wollte es erst beschreiben, bau jetzt aber doch schnell was zusammen ;) So:
1 | |
2 | |
3 | |
4 | |
Deine "Mailbox":
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
Deine GUI muss jetzt nur noch das Interface implementieren und sich bei
der Mailbox registrieren.
Natürlich sollte man sinnvollerweise nicht "String" als Nachrichtentyp
nehmen sondern ein eigenes Objekt auch könnte man natürlich noch andere
mögliche Events dem Interface hinzufügen. Senden kannst du einfach ohne
spezielle Vorkehrungen.
> Wie synchronisiere ich Threads soweit?
Ansonsten läuft sowas über das syncronized nur bei der GUI muß man
etwas vorsichtig sein, da (einige) Veränderungen an GUI-Objekten immer
im Event-Thread geschehen sollen.
Vielen Dank für die ausführliche Antwort. Ich versuche gerade mal meine Gedankengänge zusammenzufassen bitte korrigiere mich, bin wie gesagt nicht fit mit Java... Meine GUI Klasse muss newMessageArived(String message); Dazu muss ich noch das Event dafür registrieren. Wie mache ich das speziell für dieses Event? Jetzt muss ich noch dem Thread eine Referenz auf die Mailboxklasse geben, damit der das Event auch auslösen kann, kan ich der run() Methode auch Referenzen übergeben? also run(Mailbox mail)? Angenommen das funktioniert, wie würde das in die andere Richtung ausschauen? Im Moment sende ich nichts aus der GUI Anwendung raus, nur innerhalb des Threads...das ganze in die andere Richtung implementieren? Danke nochmal Michael
Michael B. schrieb: > Meine GUI Klasse muss newMessageArived(String message); > Dazu muss ich noch das Event dafür registrieren. Wie mache ich das > speziell für dieses Event? z.B. so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
Michael B. schrieb: > Jetzt muss ich noch dem Thread eine Referenz auf die Mailboxklasse > geben, damit der das Event auch auslösen kann, kan ich der run() Methode > auch Referenzen übergeben? also run(Mailbox mail)? Am besten lässt du deine Run Klasse (man erweitert normalerweise nicht Thread direkt) die Mailbox erweitern:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
Dann halt im ersten Beispiel einfach die RS232MailBox nutzen. Michael B. schrieb: > Angenommen das funktioniert, wie würde das in die andere Richtung > ausschauen? Im Moment sende ich nichts aus der GUI Anwendung raus, nur > innerhalb des Threads...
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Gast
#1622478
Viel Dank! Funktioniert bestens...! extends und Runnable waren die fehlenden Schlüsselwörter ;) Und ich habs sogar kapiert :D Vielen vielen Dank... :) Jetzt zerhaut mir dafür aber NetBeans mein SwingLayout :( verstehe wer will...muss unbewusst etwas verändert haben.. Obwohl es in der "Preview" richtig aussieht Michael
Da kann ich dir leider nicht weiterhelfen, ich bau meine GUIs immer per Hand das weis ich wenigstens was warum geht (oder auch nicht) welchen Layoutmanager verwendest du für die Buttons?
Gast
#1622568
Kein Problem habe das Layout sowieso umgebastelt jetzt passts wieder. Dafür ist mir aufgefallen das ich scheinbar ab und an events verliere... Also Daten kommen an, werden aber nicht verarbeitet... Passiert aber schon im Serialport Eventlistener... die Daten kommen nachweislich an, ich sehe die Antwort vom Modem im SerialPort Sniffer...Kann das was mit den Threads zu tun haben? Hab jetzt mal testweise alles synchronized gemacht und send und read gelocket.
Michael B schrieb: > Hab jetzt mal testweise alles synchronized > gemacht und send und read gelocket. Ah... Also das hilft nix und ist eher kontraproduktiv. > Passiert aber > schon im Serialport Eventlistener Eventuell USB/SerialWandler? hast du mal versucht die Streams manuell zu lesen? > events verliere... Wenn du Events 'verlierst' ist der PC kaputt ;) Java ist kein µC welcher nur maximal einen Interupt zur Zeit speicher kann. Wenn etwas verloren geht dann eventuell schon auf Basis der RX/TX oder Betriebssystemebene wegen Pufferüberlauf. Aber ich hab bisher keine Probleme gehabt mit verlorenen Bytes hab aber auch eine Hardware RS232.
Ja, ist richtig^^ Es ist auch bei mir direkt RS232 Trotzdem sehe ich im Terminal das Daten ankommen, aber kein Event ausgelöst wird... merkwürdig merkwürdig :( Naja ich debuge mal weiter..mal schaun ob ich noch wo was rausfinden kann Trtozdem danke :)
Also etwa so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
und dann einfach in einer Schleife vom InputStream lesen.
Gast
#1629656
Mittlerweile funktionierts, meine Statemaschine war schuld und ließ sich scheinbar mit Netbeans nicht sauber debuggen (oder was wahrscheinlicher ist, ich kanns einfach nicht :) ) Danke nochmal!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

