[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gtkmm
Subject:    Re: [gtkmm] libsigcx and gtkmm 2.4
From:       Martin Schulze <martin-ml () hippogriff ! de>
Date:       2004-05-31 14:44:05
Message-ID: 20040531144405.GA924 () ipcnotebook ! schulze
[Download RAW message or body]

Am 2004.05.30 19:42 schrieb(en) Christer Palm:
> Hi Martin!
> 
> Martin Schulze wrote:
>> 
>> Which classes from libSigCX do you need? At some time I had some
>> random thoughts about libSigCX & sigc++-2.0 - Some things should be
>> much easier to implement with the new API.
>>
> 
> My app depends rather heavily on SigCX::GtkDispatcher and SigCX:: 
> ThreadTunnel to do cross-thread signalling. I also pass around a lot  
> of signal arguments by reference, so I also depend on beeing able to  
> have fully synchronous signals.

I've just updated a dispatcher class I've been using for libsigc++ 2.0.
It's based on sigcx but only implements a subset of the functionality.
Maybe it can serve as a starting point for the port or you can just use  
it. I can't test it myself because I still haven't updated to gtkmm-2.4
(low bandwidth connection :( ). Attached is a tarball that also
includes a simple (single-threaded) test program to illustrate the
usage:

  void foo(std::string text) {
    std::cout << text.c_str() << std::endl;
  }

  int main(int argc, char *argv[]) {
    Glib::thread_init();
    Gtk::Main myApp(argc, argv);

    sigc::GtkmmDispatcher disp;

    disp.tunnel(sigc::bind(&foo, std::string("hello world")));
      /*
         - call this function from any thread;
         - bind up to 7 arguments at once
         - pass 'true' as a second argument if the slot should
           be executed synchronously;
         - make use of signal::make_slot() if the dispatcher
           should emit a signal;
       */
  }

The dispatcher tunnels slots across threads. It uses a Glib::Dispatcher
internally to trigger their execution. For performance reasons an extra  
list class is included to store the slots: 'ringbuffer' - a fixed-size  
list that supports multithreaded addition/removal of objects without  
any locks. (It can be replaced by a std::list and a mutex easily.)

To pass return values across threads an additional adaptor class would
be needed.

Regards,

  Martin


> Perhaps it would be a good idea to extend the existing Glib:: 
> Dispatcher mechanism to provide the functionality of SigCX? IMO,  
> Glib::Dispatcher is rather useless in its current form, and yet,  
> cross-thread signalling is definitely one of the, if not _the_, most  
> convenient and elegant way of doing multithreaded gtkmm  
> programming...
> 
> --
> Christer Palm
["gtkmm_dispatcher.tar.gz" (application/x-compressed-tar)]

_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtkmm-list


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic