I’ve updated the SDK with new sample: /sdk/demos/ui-framework .
This sample demonstrates principles outlined in “Sciter UI, application architecture” article.
In particular it demonstrates definition of native function (view.execTask() -> window::exec_task()) and call of UI methods (callbacks in this sample) from worker threads.
I’ve explained idea of calling UI code from worker threads in this article but in this demo I am using slightly different mechanism.
The gui_exec function looks like this:
// this function is called from worker threads to
// execute the gui_block in GUI thread
inline void gui_exec( std::function<void()> gui_block )
{
sciter::sync::event evt;
PostThreadMessage(gGUIThreadId, WM_EXEC, WPARAM(&evt),LPARAM(&gui_block));
evt.wait(); // suspend worker thread until GUI will execute the block.
}
It posts the message into GUI thread input queue. Receiver of WM_EXEC message is Windows WH_GETMESSAGE hook function:
// message hook to handle WM_EXEC in GUI thread
static LRESULT CALLBACK gui_exec_hook_GetMsgProc(int code, WPARAM wParam, LPARAM lParam )
{
MSG* pmsg = reinterpret_cast<MSG*>(lParam);
if(pmsg->message == WM_EXEC)
{
sciter::sync::event* pe = reinterpret_cast<sciter::sync::event*>(pmsg->wParam);
gui_block* pf = reinterpret_cast<gui_block*>(pmsg->lParam);
(*pf)(); // execute the block in this GUI thread
pe->signal(); // signal that we've done with it
// this will resume execution of worker thread.
}
return CallNextHookEx(0,code, wParam,lParam);
}
Using hooks allows this mechanism to work reliably even when application is running modal dialog loops.
