Visual C++中的工作线程分离
acmilan2015/06/11软件综合 IP:四川
工作线程分离并不是通常意义上的多线程,其实并不难学。多线程一般指并发多工作线程,一般需要进行各种同步操作以避免意外发生,但是分离工作线程并不需要。

分离工作线程的好处是可以做耗时的阻塞式操作(如多媒体处理、网络和磁盘操作等),同时保证界面不会无响应。
最简单的方法是使用AfxBeginThread运行工作线程,在工作线程中SendMessage、PostMessage向主线程报告状态。

CWinThread * AfxBeginThread(pfnThreadProc, pParam[, nPriority, nStackSize, dwCreateFlags, lpSecurityAttrs]);
这里一般只需要前两个参数
第一个参数pfnThreadProc是线程入口点函数UINT ThreadProc(LPVOID pParam),必须是全局函数或静态函数
第二个参数pParam是一个自定义指针(LPVOID),允许你传递一个指针(可以是一个自定义结构或CWnd*等其它指针)
注意工作线程内不要直接对MFC中的界面类进行操作,即不要直接更新界面,以防止出问题。

LRESULT pWnd->SendMessage(uMsg, wParam, lParam);
BOOL pWnd->PostMessage(uMsg, wParam, lParam);
这两个函数允许向主线程发送消息,用来通知主线程更新界面。其中SendMessage会直接调用主线程的消息处理函数(同步调用),而PostMessage只是发送一个消息让消息循环处理(异步调用)。同步调用适合调用需要数据完整性的过程,而异步调用适合调用不需要数据完整性的过程,或者通知线程退出
这里发送的不一定要是自定义消息,一个偷懒的方法可以发送一个WM_TIMER,第二个参数wParam就是OnTimer中的nIDEvent,同样可以实现通知主线程更新UI的效果。
<code class="lang-cpp">UINT ThreadProc1(LPVOID pParam)
{
    CWorkThreadDlg *pWnd = (CWorkThreadDlg*)pParam; // 获取窗口指针
                              
    while(pWnd->m_progint < 100) {
                              
        pWnd->m_progint++; // 工作
                              
        pWnd->SendMessage(WM_TIMER, 1, 0); // 报告工作(同步)
                                      
        Sleep(50); // 延时
    }
                              
    pWnd->PostMessage(WM_TIMER, 2, 0); // 报告处理完成(异步)
                              
    return 0;
}
                              
void CWorkThreadDlg::OnBnClickedStart()
{
    AfxBeginThread(ThreadProc1, this); // 第二个参数是自定义指针,这里传递窗口指针
}
                              
void CWorkThreadDlg::OnBnClickedReset()
{
    m_progint = 0;
    m_progress.SetPos(m_progint);
}
                              
                              
void CWorkThreadDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == 1) { // 接到报告工作
        m_progress.SetPos(m_progint);
    }
    else if (nIDEvent == 2) { // 接到报告完成
        AfxMessageBox("工作完成!");
    }
}</code>

捕获rrr.png
attachment icon WorkThread.rar 1.04MB RAR 28次下载

[修改于 8年11个月前 - 2015/06/11 06:25:26]

来自:计算机科学 / 软件综合
1
 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年2个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}