Veränderungen nach gtk.main() durch anderen Thread

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ich würde dir dringend zu irgendeiner Form von IPC (z.B. xmlrpc ist ganz nett und relativ simpel, umfangreichere und ausgereiftere Möglichkeit wäre u.a. noch Pyro) raten und die Prozesse getrennt verwalten und starten.

Das, was du da geplant hast, lässt sich (wenn überhaupt) dann nur sehr umständlich lösen und ist IMHO auch kein schöner Ansatz.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

Du meinst doch: http://docs.python.org/library/xmlrpclib.html
So wie ich das sehe, läuft da die Kommunikation übers Netzwerk und das finde ich eigentlich nicht gut.
Ich werde es mir trotzdem mal ausprobieren und mich wieder melden.

Vielen Dank und Viele Grüße
Maxi
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Ich habe seit neuestem den dbus für mich entdeckt, ist auch ganz simpel.

http://dbus.freedesktop.org/doc/dbus-py ... orial.html

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

das Ding scheint ganz gut zu sein, ist aber nicht Teil er Standard Bibliothek und unter Windows bekomme ich nur schwer zum laufen (so wie ich das sehe).
Ich benutzte zwar kein Windows aber ich habe extra Python als Sprache gewählt, weil sie unter verschiedenen Plattformen läuft und ich so mein Programm auch den Windows Usern zugänglich machen kann.
xmlrpc läuft übers Netzwerk und deshalb möchte ich es eigentlich auch nicht verwenden und Pyro ist wieder nicht Standard.
Habe jetzt aber eine Idee, wenn es wirklich daran liegt, dass gtk.main() in einem Anderen Prozess läuft, dann starte ich einfach mein ganzes Interface als Prozess und kann dort dann direkt gtk.main() als Hauptschleife laufen lassen.

Viele Grüße
Maxi
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Und was ist das Problem mit dem Netzwerk?

Ansonsten könntest du es auch noch mit Pipes (über subprocess) machen, aber das wäre wesentlich komplexer.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,
Und was ist das Problem mit dem Netzwerk?
Es werden Ports blockiert...

Viele Grüße
Maxi
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Auch lokale Ports? Das scheint mir höchst unüblich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

was meinst Du mit Lokalen Ports?
Naja, jedenfalls schon im ersten Beispiel:

Code: Alles auswählen

server = SimpleXMLRPCServer(("localhost", 8000))
print "Listening on port 8000..."
Das ist doch eindeutig, stellt Euch mal vor, das machen alle und dann möchte man 2 Programme ausführen und die benutzten beide den gleichen Port, viel Spaß...
Deshalb, da biege ich lieber irgendetwas unsauberes zusammen bevor ich eine Kommunikation übers Netzt aufbaue.
Aber wie schon gesagt, werde das mit dem gtk_main() als Hauptschleife eines Prozesses mal ausprobieren.

Viele Grüße
Maxi
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst ja einen zufälligen Port wählen...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

ja schon, aber das ändert nichts, vielleicht erwische ich einen Port, der trotzdem schon benutzt wird.
Und selbst wenn es nicht so wäre, dann braucht mein GUI ja auch noch eine Überwachungsfunktion, die dann wieder in einem Prozess oder Thread laufen muss und dann wird das GUI ja nicht mehr aus dem Hauptthread bzw. Prozess in dem gtk_main() läuft verändert und es geht wieder nicht.

Viele Grüße
Maxi
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

In [19]: from socket import socket

In [20]: s = socket()

In [21]: s.bind(("localhost", 0))

In [22]: s.getsockname()
Out[22]: ('127.0.0.1', 63786)
Ein freier Port, nur für dich.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Und PyGtk bietet auch Funktionen an, dass man Sockets in der Eventschleife von PyGtk überwachen kann. Und Netzwerkbibliotheken wie etwa Twisted bieten auch Möglichkeiten, dass sie das benutzen.
Zuletzt geändert von Trundle am Samstag 30. Januar 2010, 15:40, insgesamt 1-mal geändert.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Danke - gut zu wissen...

//Edit:
Und PyGtk bietet auch Funktionen an, dass man Sockets in der Eventschleife von PyGtk überwachen kann. Und Netzwerkbibliotheken wie etwa Twisted kommen bieten auch Möglichkeiten, dass sie das benutzen.
Dann brauche ich aber wieder eine externe Bibliothek.
Muss jetzt erstmal schauen, was ich mache (so viele Möglichkeiten)...
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Es ist ja nicht so, dass man diese externen Bibliotheken einfach nur willkürlich benutzt und empfiehlt, sondern weil sie das Leben erleichtern sollen. Sicher, man braucht sie nicht, man kann das auch alles selber machen. Nur wozu? Letztlich schreibt man doch nur bestehendes neu und das oftmals in schlechter. Lowlevel-Netzwerkcode macht wirklich nicht sehr viel Spaß, vor allem, wenn man es richtig machen will. Denn gerade, wenn man dann noch mit Unterprozesen arbeitet, muss man eben mit solchen spaßigen Dingen wie unterbrochenen Syscall rechnen ("EINTR") und darum mag man sich einfach nicht selber kümmern.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,
Nur wozu?
Weil man ein Gerät benutzt, bei dem eben nur Python, ohne Bibliotheken drauf ist.
Das Programm soll ja schließlich auch auf meinem iPod laufen, das jetzige Programm ohne GUI tut es ja auch.
Auf dem iPod soll es später auch mit GUI laufen und da habe ich so eine Bibliothek nicht. Ich habe zwar auch kein PyGTK aber dafür eine iPod interne Bibliothek die ich ansteuern kann.

Viele Grüße
Maxi
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

habe eine für mich akzeptable Lösung gefunden.
An diesem Code habe ich mich orientiert: http://haltcondition.net/?p=2319

Viele Grüße
Maxi[/code]
Antworten