[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究,目前MFC存在问题,win32没问题。

本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterFrame程序,以此作为以后程序的基础。其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境

2、完成什么功能

3、如何完成


1、工程环境: VS2010 + Sciter-SDK + Win7

建议:HTML页面使用的是Demo中ui-framework的UI界面,执行函数也完全Copy。

2、本文完成的功能:尝试GUI线程调用函数。

3、具体步骤如下:

首先,添加头文件:

#include "include/sciter-x-threads.h"

在窗口类中添加一个变量和一个响应函数:

  1. public: // 只写新添加的
  2. sciter::sync::gui_thread_ctx _; // instance of gui_thread_ctx
  3. // it should be created as a variable inside WinMain
  4. // gui_thread_ctx is critical for GUI_CODE_START/END to work
  5.  
  6. //消息映射的函数
  7. json::value exec_task(json::value taskId, json::value progressCb, json::value doneCb);
  8.  
  9. //Sciter的TiScript消息映射
  10. BEGIN_FUNCTION_MAP
  11.  
  12. FUNCTION_3("execTask", exec_task);
  13. END_FUNCTION_MAP

其中 sciter::sync::gui_thread_ctx _; 是为了线程能够工作必须声明的,exec_task是用来响应线程工作的。

实现部分使用的是Demo的方法:

  1. struct thread_params {
  2. json::value taskId;
  3. json::value progressCb;
  4. json::value doneCb;
  5. };
  6. void thread_body(thread_params params)
  7. {
  8. for(int i = 1; i <= 100; ++i) {
  9. ::Sleep(100);
  10. GUI_CODE_START
  11. params.progressCb.call(i); // report task progress
  12. GUI_CODE_END
  13. }
  14. // report task completion,
  15. // we can pass some result data here, for now just taskId
  16. GUI_CODE_START
  17. params.doneCb.call(params.taskId);
  18. GUI_CODE_END
  19. }
  20.  
  21. #if 0 // equivalent of the above but wihtout macro
  22. void thread_body(thread_params params)
  23. {
  24. for(int i = 1; i <= 10; ++i) {
  25. ::Sleep(1000);
  26. sciter::sync::gui_thread_ctx::exec([&]()
  27. {
  28. params.progressCb.call(i*10); // report task progress
  29. });
  30. }
  31. // report task completion,
  32. // we can pass some result data here, for now just taskId
  33. sciter::sync::gui_thread_ctx::exec([&]()
  34. {
  35. params.doneCb.call(params.taskId);
  36. });
  37. }
  38. #endif
  39. json::value CHelloWorldDlg::exec_task( json::value taskId, json::value progressCb, json::value doneCb )
  40. {
  41. thread_params params;
  42. params.taskId = taskId;
  43. params.progressCb = progressCb;
  44. params.doneCb = doneCb;
  45.  
  46. sciter::thread(thread_body,params);
  47. return json::value(); // void method
  48. }

 

最后,线程能够工作,但是,也出现了一个新的问题:

当进度条进行一半时,MFC程序会不知为何就死了,有时候有没有问题,希望有这方面研究的童鞋给点建议和方法。

 

本节源代码下载:(半成品,不提供下载)

HTML源码:

  1. <html>
  2. <head>
  3. <title></title>
  4. <style>
  5. div#content { flow:horizontal; size:*; }
  6. div#tasks { width:300px; height:*; }
  7. div#tasks > select { size:*; display:block; }
  8. div#explanation { size:*; padding:20px; overflow:auto; }
  9. div#explanation > pre { padding:10px; border:1px dotted #999; background:#ffffef; }
  10. </style>
  11. <script type="text/tiscript">
  12.  
  13. var taskNo = 0;
  14.  
  15. $(#start-task).onClick = function()
  16. {
  17. var taskElem = $(div#tasks > select).$append(<option>Task { ++taskNo }<progress max=100 /> <span.result /></option>);
  18. function onProgress(p100) { taskElem.$(progress).value = p100; }
  19. function onDone(taskId) { taskElem.$(span.result).text = "Done!"; taskElem.$(progress).remove(); }
  20.  
  21. view.execTask(taskId,onProgress,onDone);
  22. }
  23.  
  24. </script>
  25. </head>
  26. <body>
  27. <h2>Sciter UI, basic principles demo</h2>
  28. <div #content>
  29. <div #tasks>
  30. <button #start-task>Start Task</button>
  31. <select type=select></select>
  32. </div>
  33. </div>
  34. </body>
  35. </html>

C++部分修改:

查看上面的代码!

 

博客:

CSDN:http://blog.csdn.net/bbdxf

cnBlogs: http://www.cnblogs.com/bbdxf

[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究的更多相关文章

  1. [Sciter系列] MFC下的Sciter–4.HTML与图片资源内置

    [Sciter系列] MFC下的Sciter–4.HTML与图片资源内置,防止代码泄露. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterFrame程序,以此作 ...

  2. [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互

    [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...

  3. [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,语法

    [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,CSS部分自觉学习,重点说明Tiscript部分的常见语法和事件用法. 本系列文章的目的就是一步步构建出一个功 ...

  4. [Sciter系列] MFC下的Sciter–1.创建工程框架

    Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大多数 ...

  5. [Sciter系列] MFC下的Sciter–1.创建工程框架

      Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大 ...

  6. MFC下OpenGL入门(可以用)

    MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...

  7. MFC下debug改成release版本出现问题及解决办法

    自己在debug下成功运行了自己写的测试自己写第三方库的程序,这里有用到opencv库,所以同时用到了自己的库和opencv的库,需求因为要进行速度的测试,是想要把debug改成release版本,这 ...

  8. MFC下调用控制台和控制台下MFC库的支持

    1.MFC下调用控制台 在CWinApp的InitInstance中对话框的DoModal之前加入 AllocConsole(); // 开辟控制台 SetConsoleTitle(_T(" ...

  9. MFC下的各种字符串类型和相互转换

    MFC下的常用字符串数据类型表示的含义: L:Long  长 P:Point  指针 C:Const  常量 W:Wchar_t  宽字符 T:TCHAR  STR:String  字符串 在看看MF ...

随机推荐

  1. ExtJs3带条件的分页查询的实现

    使用ExtJs的同志们一定知道GridPanel哈~神器一般,非常方便的显示表格类型的数据,例如神马用户列表.产品列表.销售单列表.XXXX列表等.从数据库中查询所需的数据,以列表的形式显示出来,我们 ...

  2. C++同步串口通信

    问题描述:     C++串口通信,设置同步串口通信 问题解决:     (1)打开串口 注:     使用串口需要添加<Windows.h>头文件,打开串口主要是使用CreateFile ...

  3. specular map normal map gloss map

    http://www.marmoset.co/toolbag/learn/materials http://digitalerr0r.wordpress.com/2009/03/26/xna-shad ...

  4. Consumer closed input channel or an error occurred. events=0x8 channel is unrecoverably broken and will be disposed(待解决)

    跟文件读取有关?关闭文件读取试试. 有可能是读取文件 出现报错

  5. Chp14: Java

    1.finally keyword: finally keyword is used in association with a try/catch block and guarantees that ...

  6. DataGrid行详细信息的绑定--DataGrid.RowDetailsTe(转载)

    在Silverlight中的DataGrid控件使用中我们想点击其中一行并且看这一行的详细信息应该如何做呢?而且这个详细信息是多行的数据,而非简单的几个属性. 在这里我们使用DataGrid.RowD ...

  7. poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)

    题目 矩阵快速幂,这里的模版就是计算A^n的,A为矩阵. 之前的矩阵快速幂貌似还是个更通用一些. 下面的题目解释来自 我只想做一个努力的人 @@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1) ...

  8. [shell编程]初识sed和gawk

    一.sed编辑器       shell脚本最常见的用途就是处理文本文件,sed和gawk能够极大的简化需要进行的数据处理任务.sed编辑器是流编辑器,跟普通交互式文本编辑器(如vim)不同.流编辑器 ...

  9. Openfire 代码部署报错: Variable references non-existent resource:${workspace_loc:openfire_src}

    Variable references non-existent resource:${workspace_loc:openfire_src} -DopenfireHome=“${workspace_ ...

  10. lintcode 中等题:minimum window substring 最小子串覆盖

    题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...