gtkmm: Pointer an thread übergeben
-
Moin,
im Prinzip geht es mir um folgende Zeile(aus Tutorial zitiert):
[cpp]m_thread = Glib::Thread::create( sigc::mem_fun(*this,&MyWindow::thread_worker),true);[/cpp]
Zitat ende
Ich will jedoch eine Funktion, die nicht zur MyWindow-Klasse gehört (nach einem Button-Click) in einem eigenen Thread starten und dieser zusätzlich noch einen Pointer auf eine Klasse mitgeben. Im idealfall sollte noch eine Variable zurückgegeben werden, falls die aufgerufene Funktion aussteigt.
Ich habe versucht das mit Glib hinzubekommen, aber ich raffs einfach nicht. Auch meine g***le Suche war nicht erfolgreich.
Ist das überhaupt so machbar und wenn ja wie?
Mein Hauptproblem scheint an der
sigc::mem_fun
zu liegen, sodass ich der Create-Funktion den richtigen Slot mit geben kann.
Ich arbeite mit Code:Blocks, gtkmm unter Windows...
Viele Grüße
-
http://libsigc.sourceforge.net/libsigc2/docs/manual/html/index.html
In den Abschnitten 2 und 3 solltest du fündig werden
-
Erst einmal vielen Dank für die Antwort.
Ich habe mir das Tutorial durchgelesen und stoße auf folgendes Problem:
Wenn ich mich an Kapitel 2 Seite 3 halte, bekomme ich folgende Compiler Meldung
C:\GTK\include\sigc++-2.0\sigc++\adaptors\adaptor_trait.h||In member function
typename sigc::adaptor\_functor<T\_functor>::deduce\_result\_type<T\_arg1, void, void, void, void, void, void>::type sigc::adaptor\_functor<T\_functor>::operator()(T\_arg1) const [with T\_arg1 = const MyWindow&, T\_functor = sigc::pointer\_functor1<MyWindow*, void>]':| C:\\GTK\\include\\sigc++-2.0\\sigc++\\functors\\slot.h|136|instantiated from
static T_return sigc::internal::slot_call1<T_functor, T_return, T_arg1>::call_it(sigc::internal::slot_rep*, typename sigc::type_trait<T_arg3>::take) [with T_functor = sigc::pointer_functor1<MyWindow*, void>, T_return = void, T_arg1 = MyWindow]'|
C:\GTK\include\sigc++-2.0\sigc++\functors\slot.h|144|instantiated fromstatic void*(* sigc::internal::slot\_call1<T\_functor, T\_return, T\_arg1>::address())(void*) [with T\_functor = sigc::pointer\_functor1<MyWindow*, void>, T\_return = void, T\_arg1 = MyWindow]'| C:\\GTK\\include\\sigc++-2.0\\sigc++\\functors\\slot.h|529|instantiated from
sigc::slot1<T_return, T_arg1>::slot1(const T_functor&) [with T_functor = sigc::pointer_functor1<MyWindow*, void>, T_return = void, T_arg1 = MyWindow]'|
C:\GTK\include\sigc++-2.0\sigc++\functors\slot.h|1157|instantiated fromsigc::slot<T\_return, T\_arg1, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil>::slot(const T\_functor&) [with T\_functor = sigc::pointer\_functor1<MyWindow*, void>, T\_return = void, T_arg1 = MyWindow]'| C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\Develop\\RS232\\RS232.cpp|68|instantiated from here| C:\\GTK\\include\\sigc++-2.0\\sigc++\\adaptors\\adaptor\_trait.h|84|error: no match for call to
(sigc::pointer_functor1<MyWindow*, void>) (const MyWindow&)'|
C:\GTK\include\sigc++-2.0\sigc++\functors\ptr_fun.h|111|note: candidates are: T_return sigc::pointer_functor1<T_arg1, T_return>::operator()(typename sigc::type_trait<T_type>::take) const [with T_arg1 = MyWindow*, T_return = void]|
C:\GTK\include\sigc++-2.0\sigc++\adaptors\adaptor_trait.h|84|error: return-statement with a value, in function returning 'void'|
||=== Build finished: 2 errors, 0 warnings ===|Hier der Quellcode dazu:
[cpp]sigc::slot <void,MyWindow> sl = sigc::ptr_fun(RS232Lesen);[/cpp]
Ich habe mich auch damit beschäftigt: http://libsigc.sourceforge.net/libsigc2/docs/reference/html/group__ptr__fun.html
Demnach habe ich die aufrufende Zeile geändert zu:
[cpp]sigc::slot <void,MyWindow> sl = sigc::ptr_fun(RS232Lesen(this));[/cpp]
Und die Fehlermeldung besteht nur noch aus:
error: invalid use of void expression
Habe ich - für das erste Problem - Fehler in der Compiler Einstellung?
Ist die zweite Variante doch die richtige, aber was bedeutet die Fehlermeldung in diesem Fall? Immerhin soll ja nach Aufrufen der Funktion RS232Lesen, dieser auch noch MyWindow bekannt sein.