2Threads, 2 Module: Wie kann ich eine Queue nehmen?

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.
wdsl
User
Beiträge: 35
Registriert: Donnerstag 22. Februar 2007, 16:26

2Threads, 2 Module: Wie kann ich eine Queue nehmen?

Beitragvon wdsl » Sonntag 13. Mai 2007, 22:21

Hi,
ich bräuche sowas wie eine globale Variable oder nen Pointer um es zu ermöglichen das beide Module auf das ein und das selbe Objekt queue zugreifen können.

Problembeschreibung:
Wir erstellen eine GUI mit wxPython, die ein anderes Programm mit sockets steuert. Ich will jetzt das die GUI nicht blockiert wird und verwende deshalb 2 Threads (haupt = gui, unterthread für die Sockets). Damit man mehrere Befehle schicken kann will ich eine queue erstellen die diese Speichert und nacheinander abarbeitet. So wie bekomme ich jetzt das Queue Objekt in den Thread?

vielen Dank
wdsl
BlackJack

Beitragvon BlackJack » Sonntag 13. Mai 2007, 22:33

Beim erzeugen übergeben!?
wdsl
User
Beiträge: 35
Registriert: Donnerstag 22. Februar 2007, 16:26

Beitragvon wdsl » Sonntag 13. Mai 2007, 22:43

geht leider nicht da man ja eine Kopie und keine Referenz übergibt wie kann ich eine Referenz übergeben?

vielen Dank
wdsl
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 13. Mai 2007, 22:58

wdsl hat geschrieben:geht leider nicht da man ja eine Kopie und keine Referenz übergibt

Man übergibt den Namen an ein Objekt und das Objekt gibt es nur einmal. Sowas heißt in anderen Sprachen Call by Reference. Kopien hast du nur, wenn du ein Objekt mittels `copy.copy()` und ähnlicher Mechanismen kopierst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
wdsl
User
Beiträge: 35
Registriert: Donnerstag 22. Februar 2007, 16:26

Beitragvon wdsl » Sonntag 13. Mai 2007, 23:29

Hää ich bekomme doch nur die Werte übergeben und nicht die Addresse des Objekt.

Vielleicht mal ne kleine Veranschaulichung was ich machen will

main.py:

Code: Alles auswählen

import modul1

b = "3"
print b

test_obj = modul1.modul1(b)
print b


modul1.py:

Code: Alles auswählen

class modul1():
   def __init__(self, b):
      print b
      b = 4
      print b


Ich erhalte
3
3
4
3


ich will aber
3
3
4
4


erhalten da ich b irgendwie überschreiben will.

Also statt Call by Value wie es immer ist Call by Reference

vielen Dank
wdsl
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 13. Mai 2007, 23:53

In Python wird IMMER Call-By-Reference verwendet. Dein genanntes Beispiel würde auch unter C so nicht funktionieren:

Code: Alles auswählen

void bar(int *foo) {
    foo = 2
}


Du musst natürlich auch angeben, dass du das Objekt ändern willst und nicht den Wert auf den der Name referenziert:

Code: Alles auswählen

void bar(int *foo) {
    *foo = 2
}


In Python ist es im Prinzip das gleiche, du mußt nur ein Objekt übergeben, dass auch veränderbar (mutable) ist. Das wäre zum Beispiel die Queue.Queue:

Code: Alles auswählen

def spam(q):
    q.put("some stuff")

q = Queue.Queue()
spam(q)


Hinzu kommt bei deinem Beispiel noch, das Zahlen immutable, also unveränderlich sind und die diese deshalb auch nicht so einfach Ändern kannst.

Im Standard-Python-Tutorial wird aber eigentlich alles ganz gut beschrieben, vielleicht Hilft dir noch mal ein Blick auf dieses Dokument.[/code]
BlackJack

Beitragvon BlackJack » Montag 14. Mai 2007, 00:15

wdsl hat geschrieben:Hää ich bekomme doch nur die Werte übergeben und nicht die Addresse des Objekt.


Es werden Objekte übergeben. Namen werden an Objekte gebunden. Namen sind keine Bezeichnungen für Speicherplätze/Schachteln in die man etwas hinein tut, wie in einigen anderen Sprachen, sondern Notizzettel die an Objekte geklebt werden.

Dein Beispiel etwas kürzer:

Code: Alles auswählen

a = 42
print a

def test(b):
    print b
    b = 23
    print b

test(a)
print a


Auf das Objekt `int(42)` wird ein Zettel mit der Aufschrift `a` geklebt, dann wird das Objekt mit der Aufschrift `a` ausgegeben.

Dann wird die Funktion `test()` mit diesem Objekt aufgerufen und ein Zettel mit dem lokalen Namen `b` wird auf das Objekt geklebt. Auf dem Objekt kleben jetzt zwei Zettel. Dann wird der Zettel mit dem `b` vom Objekt entfernt und auf ein anderes geklebt: `int(23)`. Das hat keinerlei Auswirkungen auf das `int(42)` Objekt, da klebt weiterhin das `a` drauf. Darum wird das auch von dem ``print`` nach dem Funktionsaufruf ausgegeben.

Von "Call by Value" oder "Call by Reference" zu sprechen ist bei Python etwas irreführend. Es werden keine Werte (=Kopien) übergeben, aber Referenzen auch nicht, weil "Call by Reference" als Beschreibung eigentlich nur Sinn macht, wenn es einen Datentyp "Referenz" oder "Pointer" gäbe.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder