Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: CLI_Andreas_Schmidt am 17.03.05 - 13:37:53

Titel: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 17.03.05 - 13:37:53
Hi @JavaAll,

ich versuche mit folgender class:

public class DominoC implements Runnable
{
  String monteurname = "Inhalt";

public void run()
...
...
}

ein Programm auszuführen. Dieses Programm erstellt eine Verbindung zu Domino. Leider kann ich keine Variable an die Main übergeben. Da void ja das verhintert. wenn ich jedoch void in string ändere, dann meckert die Runnable... Scheint nicht zu gehen.

Was kann ich da machen. Help.

Gruss

Andreas
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: Semeaphoros am 17.03.05 - 13:40:08
verhintert.


 ???
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: animate am 17.03.05 - 13:59:15
void heißt, dass die Methode keinen Rückgabewert hat.

Der main-Methode (die in deinem Beipiel fehlt) kannst du Parameter mitgeben
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: animate am 17.03.05 - 14:00:32
ähm, von wo nach wo möchtest du was übergeben??
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 17.03.05 - 14:47:48
Ich habe eine main und die ruft zwei separate klassen auf. die erste Klasse bekommt rückgabewerte, die dann in die zweite Klasse übernommen werden soll.

Beispiel: Hole aus einer nsf datei einen Wert und übergebe ihn an ein grafische Oberläche (2te Klasse)

die mein ruft nur auf.
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 17.03.05 - 14:59:06
Dazu...

Hier meine domino Connection: public class DominoC implements Runnable

Diese wird dann mit : public void run() gestartet. Problem ist DAS VOID. Wenn ich public string versuche, dann läuft Runnable nicht mehr. Zwickmühle.

hmm.
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: animate am 17.03.05 - 15:06:51
Ich verstehe nicht so ganz das Problem

die run-Methode kannst du nicht verändern, weil du ja das Runnable Interface implementieren musst. Aber du kannst doch z.B. Klassenvariablen in deiner run Methode befüllen und die dann verwenden.
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 17.03.05 - 15:28:43
Genau das versuche ich. Da ich aber ein Anfänger bin, fällt mir das doch noch recht schwer. Ich suche ja schon den ganzen Vormittag das Problem zu lösen. : (
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: Marinero Atlántico am 17.03.05 - 16:58:29
Genau das versuche ich. Da ich aber ein Anfänger bin, fällt mir das doch noch recht schwer. Ich suche ja schon den ganzen Vormittag das Problem zu lösen. : (
An einem Tag gleichzeitig mit Multithreading und mit Swing anzufangen ist auch eher mutig.

Thomas hat Recht.

Code
public class DominoC implements Runnable
{
  String monteurName = "Inhalt"; // camelCase !!!
NotesSession nSession= null; 
public void run()
  nSession = yourStuffComesHere. 
...
}
Aber das ist nur der Anfang.
Mit Multithreading musst du ein paar mehr Dinge beachten.
Du weisst, dass du run() nicht direkt aufrufen kannst?

Gruß Axel
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 21.03.05 - 11:09:34
Hi @all,

als Ansatz. So sieht mein Code aus: --> Die Variable "testvar" brauche ich in einer anderen Klasse. Leider steht die weiterhin auf "jupp", nachdem run() gelaufen ist. Das liegt am void, was ich ja nicht ändern kann. ???

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();
 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();}}
}
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: Marinero Atlántico am 21.03.05 - 11:29:50

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();}}
}
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. 
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 21.03.05 - 12:04:31
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();

      //
   }
}
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: Marinero Atlántico am 21.03.05 - 12:19:52
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) {}
}

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();

      //
   }
}

VON EINER RÜCKGABEVARIABLE AUS RUN HAST DU SOWIESO NICHTS.
Das ist ja ein eigener Thread und läuft PARALLEL (asynchron) zu deinem Restprogramm.
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 21.03.05 - 15:35:18
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.
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: Marinero Atlántico am 21.03.05 - 16:01:37
Es bereitet mir doch Kopfschmerzen, um zu begreifen, was da jetzt genau passiert.
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
    	}
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.
Übergibs im KOnstruktor.
Code
gkgui gui = new gkgui(testVar);
Der Konstruktor muss dann ca. so aussehen:

Code
class gkgui {  // KLASSEN SCHREIBT MAN GROSS. 
  String testVar;

public gkgui(String testVar) {
this.testVar = testVar;
}
Code
Titel: Re: Brauche ein Rückgabevariable...
Beitrag von: CLI_Andreas_Schmidt am 21.03.05 - 16:33:35
Hab es so gemacht und es läuft jetzt recht gut. ich werde jetzt hier erst mal "HALT" machen und in meinen Büchern das ganze noch mal nachlesen. Das war sehr viel auf einmal. Auf jeden Fall bin ich jetzt ein ganzes Stück weiter. : ) Danke Marinero Atlantico.......

Klasse.