Observer-Pattern mit boost führt zum Speicherzugriffsfehler
Verfasst: Montag 16. April 2007, 11:37
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
funktioniert es auf einmal. Hier erstmal einbisschen Source, damit seht was ich meine.
Die Moduledefinition hierzu sieht wie folgt aus:
Wenn ich jetzt den Pythonsource so
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
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
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"));
}
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");
}
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")
Danke schon mal im vorraus.
gruß,
tyr377