Observer-Pattern mit boost führt zum Speicherzugriffsfehler

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
tyr377
User
Beiträge: 4
Registriert: Montag 16. April 2007, 11:08

Hallo,

ich sitze hier gerade ein einer API die eine Pythonklasse benachrichtigen soll, wenn sich bestimmte Zustände ändern. Soweit funktioniert auch alles, nur wenn ich in Python eine Instanz erzeuge und mit raw_input oder sleep auf ein Event warte gibt mit das Programm einen Speicherzugriffsfehler aus. Mach ich aber ein Busy-Waiting mit

Code: Alles auswählen

while 1:
   pass
funktioniert es auf einmal. Hier erstmal einbisschen Source, damit seht was ich meine.

Code: Alles auswählen

// eigentlich C++
class PyDCDObserver : public Observer
{
	private :
		PyObject* self;
	public  :
		PyDCDObserver(PyObject* p_obj) : self(p_obj) {}
		void performEvent(Observable* observable);

};

void PyDCDObserver::performEvent(Observable* observable)
{
	call_method<void,boost::python::str>(self, "performEvent", str("irgendwas"));
}
Die Moduledefinition hierzu sieht wie folgt aus:

Code: Alles auswählen

BOOST_PYTHON_MODULE_INIT(PyDCDEventLayer)
{
    class_<PyDCDHandler>("PyDCDHandler")
        .def("connectServer",    &PyDCDHandler::connectServer)
        .def("disconnectServer", &PyDCDHandler::disconnectServer)
        .def("addObserver",      addobserverById)
        .def("delObserver",      delobserverById)
    ;
    
    class_<Observer,boost::noncopyable, boost::shared_ptr<PyDCDObserver> >("PyDCDObserver");
}

Wenn ich jetzt den Pythonsource so

Code: Alles auswählen

from PyDCDEventLayer import *

class MyDCD (PyDCDObserver):
    def performEvent(self, x):
        print x

a = PyDCDHandler()
print "connect %i" % a.connectServer("localhost", 5555)
      
b = MyDCD()
c = a.getParameterList()

print "parameter : %i" % a.addObserver('monitor.level.1', b)

# Problem !!!
raw_input("drueck enter")
schreibe, tritt der Fehler auf. Wenn ich raw_input wie gesagt durch busy-waiting ersetze funktioniert es. Kann mir da jemand einen Denkanstoß geben, woran es liegen könnte?

Danke schon mal im vorraus.

gruß,
tyr377
Antworten