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 fromstatic 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 from static 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 fromsigc::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 from sigc::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.


Anmelden zum Antworten