[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究

时间:2021-08-24 06:16:41

[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"

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

public:  // 只写新添加的
sciter::sync::gui_thread_ctx _; // instance of gui_thread_ctx
// it should be created as a variable inside WinMain
// gui_thread_ctx is critical for GUI_CODE_START/END to work //消息映射的函数
json::value exec_task(json::value taskId, json::value progressCb, json::value doneCb); //Sciter的TiScript消息映射
BEGIN_FUNCTION_MAP FUNCTION_3("execTask", exec_task);
END_FUNCTION_MAP

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

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

struct thread_params {
json::value taskId;
json::value progressCb;
json::value doneCb;
};
void thread_body(thread_params params)
{
for(int i = 1; i <= 100; ++i) {
::Sleep(100);
GUI_CODE_START
params.progressCb.call(i); // report task progress
GUI_CODE_END
}
// report task completion,
// we can pass some result data here, for now just taskId
GUI_CODE_START
params.doneCb.call(params.taskId);
GUI_CODE_END
} #if 0 // equivalent of the above but wihtout macro
void thread_body(thread_params params)
{
for(int i = 1; i <= 10; ++i) {
::Sleep(1000);
sciter::sync::gui_thread_ctx::exec([&]()
{
params.progressCb.call(i*10); // report task progress
});
}
// report task completion,
// we can pass some result data here, for now just taskId
sciter::sync::gui_thread_ctx::exec([&]()
{
params.doneCb.call(params.taskId);
});
}
#endif
json::value CHelloWorldDlg::exec_task( json::value taskId, json::value progressCb, json::value doneCb )
{
thread_params params;
params.taskId = taskId;
params.progressCb = progressCb;
params.doneCb = doneCb; sciter::thread(thread_body,params);
return json::value(); // void method
}

 

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

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

[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究

 

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

HTML源码:

<html>
<head>
<title></title>
<style>
div#content { flow:horizontal; size:*; }
div#tasks { width:300px; height:*; }
div#tasks > select { size:*; display:block; }
div#explanation { size:*; padding:20px; overflow:auto; }
div#explanation > pre { padding:10px; border:1px dotted #999; background:#ffffef; }
</style>
<script type="text/tiscript"> var taskNo = 0; $(#start-task).onClick = function()
{
var taskElem = $(div#tasks > select).$append(<option>Task { ++taskNo }<progress max=100 /> <span.result /></option>);
function onProgress(p100) { taskElem.$(progress).value = p100; }
function onDone(taskId) { taskElem.$(span.result).text = "Done!"; taskElem.$(progress).remove(); } view.execTask(taskId,onProgress,onDone);
} </script>
</head>
<body>
<h2>Sciter UI, basic principles demo</h2>
<div #content>
<div #tasks>
<button #start-task>Start Task</button>
<select type=select></select>
</div>
</div>
</body>
</html>

C++部分修改:

查看上面的代码!

 

博客:

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

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

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

  1. &lbrack;Sciter系列&rsqb; MFC下的Sciter&ndash&semi;4&period;HTML与图片资源内置

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

  2. &lbrack;Sciter系列&rsqb; MFC下的Sciter&ndash&semi;3&period;Sciter脚本与底层交互

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

  3. &lbrack;Sciter系列&rsqb; MFC下的Sciter&ndash&semi;2&period;Sciter中的事件&comma;tiscript&comma;语法

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

  4. &lbrack;Sciter系列&rsqb; MFC下的Sciter&ndash&semi;1&period;创建工程框架

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

  5. &lbrack;Sciter系列&rsqb; MFC下的Sciter–1&period;创建工程框架

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

  6. MFC下OpenGL入门&lpar;可以用)

    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. day 2 Linux基础

    6.用户.群组和权限 1) 新建用户natasha,uid为1000,gid为555,备注信息为"master" useradd natasha usermod -u1000 na ...

  2. js未定义判断

    if (typeof(homeType) == 'undefined') { //..... //..... } typeof函数判断,如果未定义的就会返回undefined,注意undefined ...

  3. 160223、jquery中attr和prop的区别

    在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...

  4. 初学java之try-catch-finally语句的实例

    /* try - catch语句的例子,模拟向货船上装载集装箱 ,如果货船超重,那么货船认为这是一个异常,将拒绝装载集装箱, 但无论是否发生异常,货船都需要正点起航. */ package st; c ...

  5. Win8 URI 方案 ms-appX 用法大全

    ms-appdata://可以引用来自应用的本地.漫游和临时数据文件夹中的应用文件ms-appdata:///local/hello/logo.png ms-appx://可以引用来自应用包的应用文件 ...

  6. Minimum&lowbar;Window&lowbar;Substring两种方法求解

    题目描述: Given a string S and a string T, find the minimum window in S which will contain all the chara ...

  7. CC&plus;&plus;初学者编程教程&lpar;13&rpar; 基于Oracle linux 的Oracle12c环境搭建

    1设置虚拟机选项 2 设置文件夹共享 3启动文件夹共享向导 4 设置共享文件夹 5 启用共享 6 关闭虚拟机设置 7 开启虚拟机 8 登陆帐户 9 看见虚拟机桌面 10 安装vmwaretools 1 ...

  8. springboot全局异常处理

    @Slf4j@ControllerAdvicepublic class RestExceptionHandler extends ResponseEntityExceptionHandler { @E ...

  9. C&num;任务同步

    using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using ...

  10. Python中for循环搭配else的陷阱

    假设有如下代码: for i in range(10): if i == 5: print 'found it! i = %s' % i else: print 'not found it ...' ...