Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
Brauche ein Rückgabevariable...
Marinero Atlántico:
--- Zitat von: CLI_Andreas_Schmidt am 21.03.05 - 11:09:34 ---
public class DominoC implements Runnable
{
public String testvar = "jupp";
public
DominoC() {}
public void run()
{
try
{
Session s = NotesFactory.createSession("localhost");
Database db = s.getDatabase("","test.nsf");
String testvar = doc.getItemValueString("RESM_Name");
...
...
String p = s.getPlatform();
String cu = s.getCommonUserName();
String nv = s.getNotesVersion();
String sn = s.getServerName();
String un = s.getUserName();
testvar="wasDuWolle"; /// HIER HIER HIER
System.out.println(nv);
System.out.println(sn);
System.out.println(p);
System.out.println(db.getTitle());
System.out.println(v.getName());
s.recycle();
}
catch (NotesException n) {
System.out.println("ID: " + n.id + " -- Name: " + n.text);
}
catch (Exception e){
e.printStackTrace();}}
}
--- Ende Zitat ---
Das sieht erstmal trivial aus. S. bold Zeile.
Das Problem ist aber zu kontrollieren, wann das gesetzt wird, wenn du mit mehreren Threads arbeitest.
Threads laufen eben parallel.
In einer anderen Klasse rufst du dominoC.start() auf. Dies setzt den in der Run-Methode Thread in den Ready-to-run Status. Irgendwann läuft der los. Du weisst nur nicht so recht wann.
Mit Multithreading hast du nicht mehr ein Programm, das sequentiell abgearbeitet wird, sondern mehrere Threads, die parallel laufen. Genau das kompliziert das Verständnis für den Programmablauf in einem sehr hohen Grade.
Wenn du nach dem Aufruf von start() s.o. die Variable im parent-Thread abfragst, ist nicht sicher, dass sie dann schon gesetzt ist.
Wie sieht der Teil aus, wo du start() aufrufst, poste das bitte.
Wobei ich wenig Zeit habe.
Aufruf (rund um dominoC.start(): (dies ist KEIN robuster code, könnte aber funktionieren).
--- Code: ---dominoC.start(); // oder wie immer du das DominoC Objekt genannt hast.
Thread.currentThread().sleep(5000); // diesen Thread wird 5 sek schlafen gelegt.
// der andere Thread müsste jetzt laufen.
System.out.println("dominoC.testVar=" + dominoC.testVar); // wird in run Methode gesetzt. s. o.
--- Ende Code ---
CLI_Andreas_Schmidt:
hier wird der Start durchgeführt:
public class gkstart {
public static void main(String[] args) {
//
DominoC dc = new DominoC();
Thread nt = new Thread((Runnable)dc);
nt.start();
//
gkgui gui = new gkgui();
new gkgui().show();
//
}
}
Marinero Atlántico:
--- Code: ---//vereinfacht:
public class DominoC implements Runnable
{
public String testvar = "jupp";
public
DominoC() {}
public void run()
{
Session s = null;
try
{
s = NotesFactory.createSession("localhost");
testvar="wasDuWolle"; /// HIER HIER HIER
s.recycle();
s = null;
}
catch (Throwable e) {
e.printStackTrace();
// sieht komisch aus, ist aber wichtig!!!!
if (s!= null) {
try {
s.recycle();
s=null;
} catch (Throwable e) {}
}
--- Ende Code ---
caller:
--- Code: ---public class gkstart {
public static void main(String[] args) {
//
DominoC dc = new DominoC();
Thread nt = new Thread((Runnable)dc);
nt.start();
Thread.currentThread().sleep(5000); // dieser Thread wird 5 sek schlafen gelegt.
// der andere Thread müsste jetzt laufen --> der in run, s.o.
// nach 5 sek. oder später wacht dieser Thread wieder auf und printed:
System.out.println("dc.testVar=" + dc.testVar); // wird in run Methode gesetzt. s. o.
//
gkgui gui = new gkgui();
new gkgui().show();
//
}
}
--- Ende Code ---
VON EINER RÜCKGABEVARIABLE AUS RUN HAST DU SOWIESO NICHTS.
Das ist ja ein eigener Thread und läuft PARALLEL (asynchron) zu deinem Restprogramm.
CLI_Andreas_Schmidt:
Das mit dem Sleep funktioniert jetzt gut. Der Rückgabewert aus der DominoC ist in die Main zurückgegeben worden. --> Die Variable ist gefüllt. Es bereitet mir doch Kopfschmerzen, um zu begreifen, was da jetzt genau passiert. Das InterrupedException hat noch gefehlt. Ist schon sehr heftig, was da passiert.
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
}
Jetzt käme das nächste Problem. Die ausgelesene Variable in die gui zu übernehmen. Heisst. Nachdem die DominoC.class sauber durchgelaufen ist, wird jetzt als nächstes die gui.class geladen. Hier soll jetzt die Variable weiterverarbeitet werden.
Marinero Atlántico:
--- Zitat von: CLI_Andreas_Schmidt am 21.03.05 - 15:35:18 ---Es bereitet mir doch Kopfschmerzen, um zu begreifen, was da jetzt genau passiert.
--- Ende Zitat ---
mir auch. Multithreading zu verstehen und effizient zu managen ist definitiv hart. Meist hat man aber zumindest mit Thread-Management wenig zu tun. Eher schon, dass eine Komponente von mehreren Threads benutzt wird. Das ist aber einfacher als selbst Threads zu steuern (was du hier machst).
Im Grunde sind das in der Run-Methode und dein main 2 Programme.
Vielleicht noch in Swing oder SWT relativ häufig, aber das ist da relativ immer der gleiche Trick.
NIE. NIEMALS. NEVER. NUNCA das catch statement leer lassen. S. mein
Ausnahme: Das schliessne einenr connection in einem catch-Block.
code.
--- Code: ---try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace(); // WICHTIG
}
--- Ende Code ---
--- Zitat ---Jetzt käme das nächste Problem. Die ausgelesene Variable in die gui zu übernehmen. Heisst. Nachdem die DominoC.class sauber durchgelaufen ist, wird jetzt als nächstes die gui.class geladen. Hier soll jetzt die Variable weiterverarbeitet werden.
--- Ende Zitat ---
Übergibs im KOnstruktor.
--- Code: ---gkgui gui = new gkgui(testVar);
--- Ende Code ---
Der Konstruktor muss dann ca. so aussehen:
--- Code: ---class gkgui { // KLASSEN SCHREIBT MAN GROSS.
String testVar;
public gkgui(String testVar) {
this.testVar = testVar;
}
--- Ende Code ---
--- Code: ---
--- Ende Code ---
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln