Seite 1 von 1

Events

Verfasst: Dienstag 4. Januar 2005, 23:44
von alpha
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

Verfasst: Mittwoch 5. Januar 2005, 21:54
von alpha
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

Verfasst: Mittwoch 5. Januar 2005, 22:12
von Dookie
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

Verfasst: Mittwoch 5. Januar 2005, 23:08
von alpha
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

Verfasst: Mittwoch 5. Januar 2005, 23:55
von Dookie
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

Verfasst: Donnerstag 6. Januar 2005, 01:17
von alpha
Ich werds mal probieren und wenn es klappt (oder acuh nicht) den Code mal posten.

Danke

geschafft

Verfasst: Donnerstag 6. Januar 2005, 23:48
von alpha
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

Verfasst: Freitag 7. Januar 2005, 11:44
von Leonidas
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.

Verfasst: Freitag 7. Januar 2005, 11:50
von alpha
Brauch ich hier garnicht :D Dachte nur ich brauch vieleicht noch nen Konstruktor. Stört ja nicht weiter, oder?

Verfasst: Freitag 7. Januar 2005, 13:04
von Leonidas
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()

Verfasst: Freitag 7. Januar 2005, 14:56
von alpha
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