Python Embedding Thread safe?

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.
Antworten
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Samstag 19. Juli 2008, 13:18

Hallo,

ich habe ein kleines Problem mit meiner eingebetteten Python Anbindung. Ich habe so gut wie fast alles gewrappt und stelle alles in Python zur Verfügung.

Mein Ziel: Ich möchte es möglich machen, mehrere Skripte gleichzeitig laufen zu lassen.

Mein Problem: Python ist ja nicht Thread-safe?

Was habe ich bisher gemacht. Ich klicke in meinem Programm auf einen Eintrag und öffne damit das entsprechende Python Skript. Jetzt wird ein neuer Thread geöffnet und darin der komplette Python Teil ausgeführt, heißt:

Code: Alles auswählen

PyObject *f_globals, *f_locals, *mod, *rv;
				mod = PyImport_ImportModule("__main__");
				if (!mod)
					return;
					   
				f_globals = PyModule_GetDict(mod);
				f_locals = PyDict_New();
				PyDict_Update(f_locals, f_globals);
				if (!f_locals) {
						Py_DECREF(mod);
						PyErr_Print();
						return;
				}
					
				rv = PyRun_String(<der python code>, Py_file_input, f_locals, f_locals);
				GePrint("ZUENDE");
				if (!rv)
					PyErr_Print();
				

				Py_XDECREF(rv);
				Py_DECREF(mod);
				Py_DECREF(f_locals);
Wenn ich jetzt ein anderes Skript öffne verbschiedet sich das ganze Programm. Das Skript hier zum Beispiel möchte ich starten.


Code: Alles auswählen

from test import *

class test(yourGUI):

   MYBUTTON = 0
	
   def create_gui(self):
      self.set_title("Dialog I")	
      MYBUTTON = self.add_button("Ich habe einen Namen",150,15,self.button_click)
      return True

   def button_click(self):
      println("ich bin der button")

if __name__ == "__main__":
   fn = test()
   fn.open(True)

Das Problem ist, dass er beim öffnen der GUI (also bei fn.open(True) das Objekt erzeugt und sofort das Skript beendet weil danach ja nichts mehr kommt und deallokiert danach sofort wieder alles. Gibts eine Möglichkeit wie bei wxPython eine art mainloop einzubauen? Wie funktioniert dieser?



Gibts eine Möglichkeit Python einfach Thread-safe zu machen?


Danke schön!
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Samstag 19. Juli 2008, 19:58

Ich verkürze das Problem eventuell etwas.

Der erstellte Dialog läuft asynchron, das heißt der Aufruf der die GUI öffnet
fn.open() gibt nicht erst einen return wenn der Dialog geschlossen ist, sondern das Skript läuft sofort weiter.


Und vor Ende des Skriptes bräuchte ich eine Möglichkeit, die ressourcenschonend verhindert, dass das Skript terminiert. Eventuell jemand eine Idee?

Danke
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Montag 21. Juli 2008, 12:41

Keine Idee? :-/
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Montag 21. Juli 2008, 12:50

Sorry, aber wenn sonst niemand eine Idee hat: comp.lang.python - dort wirst Du vielleicht Hilfe finden.

Gruß,
Christian
Antworten