
Chris and Thore, ----- Original Message ----- From: "Thore Karlsen" <sid@6581.com> Newsgroups: gmane.comp.lib.boost.devel Sent: Wednesday, December 14, 2005 4:53 AM Subject: Re: Asio formal review
On Tue, 13 Dec 2005 20:34:45 +1000, Matthew Vogt <mattvogt@warpmail.net> wrote:
I wonder how the demuxer would be incoporated into a GUI event-loop-based program, particularly in toolkits which mandate that GUI updates can occur from a single thread only? I was wondering the same thing. For Windows clients I like WSAAsyncSelect() and just driving the sockets through the GUI message loop, since I don't have to worry about threading issues. Another reason I like it is because I can have several dozen windows open, each one a separate component. I really can't afford to have several threads (at least one to drive the demuxing and one for the async resolves) created for each window, and I would prefer not to require each window to have to register with a shared demuxing thread.
Hope Chris doesnt mind me jumping in here. background - In win32 you can send things to the gui thread from any other thread by posting a message to _any_ window. The windows procedure associated with that window will be called with that message in the gui thread (or more specifically in the thread on which the window was created) provided that thread has a message pump running. use with asio Its feasible to use this to create dispatcher class, similar to asio::locking_dispatcher which can be used to send function objects to be executed in the gui thread (call this asio::gui_dispatcher). This component internally creates a hidden window. A call to gui_dispatcher.post() or dispatch() queues the function object and posts a message to the hidden window. The windows proc associated with the window then unqueues the function object and calls it. I dont think you need to register every window with asio. Just create one gui_dispatcher and use it to wrap your Handlers before passing them to asio socket functions. (theres a zip in the vault Defer.zip under Concurrent Programming that does something like this but not as an asio::dispatcher model) Cheers Simon