Autor Thema: Brauche ein Rückgabevariable...  (Gelesen 5972 mal)

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Brauche ein Rückgabevariable...
« 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
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Brauche ein Rückgabevariable...
« Antwort #2 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
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Brauche ein Rückgabevariable...
« Antwort #3 am: 17.03.05 - 14:00:32 »
ähm, von wo nach wo möchtest du was übergeben??
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Re: Brauche ein Rückgabevariable...
« Antwort #4 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.
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Re: Brauche ein Rückgabevariable...
« Antwort #5 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.
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: Brauche ein Rückgabevariable...
« Antwort #6 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.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Re: Brauche ein Rückgabevariable...
« Antwort #7 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. : (
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

Marinero Atlántico

  • Gast
Re: Brauche ein Rückgabevariable...
« Antwort #8 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

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Re: Brauche ein Rückgabevariable...
« Antwort #9 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();}}
}
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

Marinero Atlántico

  • Gast
Re: Brauche ein Rückgabevariable...
« Antwort #10 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. 
« Letzte Änderung: 21.03.05 - 11:41:47 von Marinero Atlántico »

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Re: Brauche ein Rückgabevariable...
« Antwort #11 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();

      //
   }
}
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

Marinero Atlántico

  • Gast
Re: Brauche ein Rückgabevariable...
« Antwort #12 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.
« Letzte Änderung: 21.03.05 - 12:28:00 von Marinero Atlántico »

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Re: Brauche ein Rückgabevariable...
« Antwort #13 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.
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

Marinero Atlántico

  • Gast
Re: Brauche ein Rückgabevariable...
« Antwort #14 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

Offline CLI_Andreas_Schmidt

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
    • Lotus Notes & Domino Schulung und Entwicklung
Re: Brauche ein Rückgabevariable...
« Antwort #15 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.
Viele Grüße

Andreas.Schmidt@lotus-schmidt.de

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz