Events

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Events

Beitragvon alpha » Dienstag 4. Januar 2005, 23:44

Hallo Leute,

hat jemand ein ganz einfaches Beispiel wie man in der einem Objekt einen Event auslöst und damit ne Funktion in nem anderen Objekt aufruft. Ich brauch das um etwas asyncron zu verarbeiten.

Danke schonmal

alpha
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Beitragvon alpha » Mittwoch 5. Januar 2005, 21:54

Hallo Ihr da drausen,

kann es wirklich sein, daß das nicht geht. Das muß doch möglich sein. Das muß doch gehen, daß ein Objekt einen Event feuert, auf den sich ein anderes Objekt anmeldet. Das geht doch sogar in Visual Basic.

Danke schonmal für die Antworten.

alpha
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 5. Januar 2005, 22:12

Hi alpha,

ich weiss nicht ob das geht, da ich mit deiner Problembeschreibung nicht wirklich was anfangen kann. Liegt vielleicht daran, daß ich von VB null ahnung habe und daher mit deinem Terminus probleme habe. Eventuell könntes du etwas klarer beschreiben was du machen willst.

"Asyncrone" und "Event feuern" deuten wohl darauf hin, daß du mit Threads arbeiten willst und die miteinander kommunizieren lassen willst? Dann schau dir mal das Modul threading an.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Beitragvon alpha » Mittwoch 5. Januar 2005, 23:08

Hallo Dookie,

also die Sache ist so:
Objekt A erzeugt eine Instanz von Objekt B. Dann ruft Objekt A eine Funktion von der neuen Instanz des Objekts B auf, soll dann aber nicht warten bis die Funktion abgearbeitet ist (die Funktion startet z.B. nen neuen Thread in dem das Ganze dann abgearbeitet wird) sondern läuft ganz normal weiter. Ist der Thread von Objekt B jetzt fertig soll er einen Event (oder nenn es Callback) machen um jetzt rückwärts wieder ne Funktion von Objekt A aufzurufen mit z.B. einem Berechnungsergebnis. Solche Ereignisgesteuerte Programmierung ist ja bei Windows ja gang und gebe. Die Objekte im Tkinter haben ja auch solche Callbacks, wenn z.B. ein Button gedrückt wird ruft der Button ja auch ne Funktion auf.
Tut mir leid wenn ich es zunächst etwas zu wirr beschrieben habe :oops:

Danke mal fürs lesen.

alpha
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 5. Januar 2005, 23:55

So wie du es beschreibst kannst du es ja auch machen. Übergib dann beim Erzeugen von Objekt B einfach als Parameter das Objekt A das es erzeugt hat, dann kannst du von B eine Methode von A aufrufen, bzw. über threading einen Event mit dem Ergebnis an A senden.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Beitragvon alpha » Donnerstag 6. Januar 2005, 01:17

Ich werds mal probieren und wenn es klappt (oder acuh nicht) den Code mal posten.

Danke
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

geschafft

Beitragvon alpha » Donnerstag 6. Januar 2005, 23:48

Hallo Dookie,
habs hinbekommen. Falls jemand sowas mal braucht hier der Code.

Code: Alles auswählen

import thread
import time

class Main:
   def __init__(self):
      myrechner = Rechner()
      myrechner.doit(self)
      for i in range(5):
         time.sleep(1)
         print "Wait:" + str(i)
   
   def solution(self, x):
      print "Ergebnis ist: " + str(x)
   
      
      
class Rechner:
   def __init__(self):
      pass
   
   def doit(self, obj):
      thread.start_new_thread(self.__calc,(obj,))
      
   def __calc(self, obj):
      x = 5+5
      time.sleep(3)
      obj.solution(x)
      
if __name__ == '__main__':
   main = Main()


Gruß
alpha

Edit (Leonidas): Code in Python Tags gesetzt
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 7. Januar 2005, 11:44

Alpha, wofür brauchtst du in Rechner eine __init__ wenn da nur pass drin ist? Vielleicht wird dich ja noch dieses Kapitel aus dem Python Cookbook interessieren.
Zuletzt geändert von Leonidas am Freitag 7. Januar 2005, 13:01, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Beitragvon alpha » Freitag 7. Januar 2005, 11:50

Brauch ich hier garnicht :D Dachte nur ich brauch vieleicht noch nen Konstruktor. Stört ja nicht weiter, oder?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 7. Januar 2005, 13:04

alpha hat geschrieben:Brauch ich hier garnicht :D Dachte nur ich brauch vieleicht noch nen Konstruktor. Stört ja nicht weiter, oder?

Nein, stören tuts nicht, könnte vielleicht für die zukünftige Entwicklung nötig sein.

Jetzt noch ein kompakterer Code:

Code: Alles auswählen

import thread
import time

class Main:
    def __init__(self):
        self.doit()
        for i in range(5):
            time.sleep(1)
            print "Wait:" + str(i)
   
    def solution(self, x):
        print "Ergebnis ist: " + str(x)
   
    def doit(self):
        thread.start_new_thread(self.__calc, ())
   
    def __calc(self):
        x = 5+5
        time.sleep(3)
        self.solution(x)
       
if __name__ == '__main__':
    Main()
My god, it's full of CARs! | Leonidasvoice vs Modvoice
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Beitragvon alpha » Freitag 7. Januar 2005, 14:56

Hallo Leonidas,

so geht es natürlich auch. :) Ich wollte aber mal ausprobieren ob es in mehreren Klassen möglich ist. Hintergrund ist der, dass manchmal mehrere Leute an einem Projekt arbeiten und dann muß man sich natürlich die Arbeit aufteilen. Einer macht dann z.B. Datenbankzugriffe oder sowas und der Andere kümmert sich um was anderes. Um jetzt nicht immer eine Funktion aufzurufen um zu schauen ob sich was geändert hat ist es so jetzt möglich der anderen Klasse einen Event zukommen zu lassen.

Darum wollte ich das mal ausprobieren.

Gruß
alpha

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder