热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

30、深入浅出MFC学习笔记,多线程

一、基本概念1、模块:一段可执行的程序(包括EXE和DLL),其程序代码、数据、资源被加载到内存中,由系统建置一个数据结构来管理它,就是一个模块。这里所说的数据结构,名为Modul

一、基本概念

1、模块:一段可执行的程序(包括EXEDLL),其程序代码、数据、资源被加载到内存中,由系统建置一个数据结构来管理它,就是一个模块。这里所说的数据结构,名为Module DatabaseMDB),其实就是PE格式中的PE表头,可以从WINNT.H 档中找到一个IMAGE_NT_HEADER 结构,就是它。

2、进程:就是一大堆拥有权(ownership)的集合。进程拥有地址空间(由memory context决定)、动态配置而来的内存、文件、执行线程、一系列的模块。操作系统使用一个所谓的Process DatabasePDB)数据结构,来记录(管理)它所拥有的一切。

3、线程:系统以一个特定的数据结构(Thread DatabaseTDB)记录执行线程的所有相关资料,包括执行线程局部储存空间(Thread Local StorageTLS)、消

息队列、handle表格、地址空间(Memory Context )等。

进程主要表达「拥有权」的观念,执行线程则主要表达模块中的程序代码的「执行事实」。

4CPU调度单位是执行线程。调度器据以排序的,是每个执行线程的优先权。

5、一般,timeslice20milliseconds

6PDB连接模块示例

wps_clip_image-28024

7、当Windows 加载器将程序加载内存中,KERNEL32挖出一些内存,构造出一个PDB、一个TDB、一个以上的MDBs(视此程序使用到多少DLL而定)。针对TDB,操作系统又要产生出memory context(就是在操作系统书籍中提到的那些所谓page tables)、消息队列、handle表格、环境数据结(EDB)。当这些系统内部数据结构都构造完毕,指令指位器(Instruction Pointer)移到程序的进入点,才开始程序的执行。

8、会被冻结,表示这个执行线程「要去抓取消息,而执行线程所附带的消息队列中却没有消息」。

    冻结有两种方法:一种是SuspendThread,另外一种是暂时冻结Sleep

9、线程上下文:狭义来讲是指一组缓存器值(包括指令指位器IP)。

10Worker ThreadsUI Threads

    从Windows 操作系统的角度来看,执行线程并未分类。但从MFC的角度看,则把执行线程划分为和使用者接口无关的worker threads,以及和使用者接口

UI)有关的UI threads

    基本上,当我们以::CreateThread 产生一个执行线程,并指定一个执行线程函数,它就是一个worker thread,除非在它的生命中接触到了输入消息-这时候它应该有一个消息循环,以抓取消息,于是该执行线程摇身一变而为UI thread

注意,执行线程本来就带有消息队列。而如果执行线程程序代码中带有一个消息循环,就称为UI thread

11、用多线程的时机

把所有UIUser Interface)动作都集中在主执行线程中,其它的「纯种运算工作」考虑交给worker threads

12、创建多线程

应该先产生一个CWinThread对象,再调用其成员函数CreateThread或全域函数AfxBeginThread将执行线程产生出来。因为CWinThread::CreateThread AfxBeginThread不只是::CreateThread 的一层包装,更做了一些application framework所需的内部数据初始化工作,并确保正确的C runtime library版本。

1)建立Worker Threads

    利用函数CreateThread或全域函数AfxBeginThread去做。

示例程序

CWinThread* pThread = AfxBeginThread(ThreadFunc, &Param);
...
UINT ThreadFunc (LPVOID pParam)
{
...
}

2)建立UI Threads

产生CWinThread 对象,为了借助其中的消息循环,CWinThread::Run

示例程序

class CMyThread : public CWinThread
{
DECLARE_DYNCREATE(CMyThread)
public:
void BOOL InitInstance();
};
IMPLEMENT_DYNCREATE(CMyThread, CWinThread)
BOOL CMyThread::InitInstance()
{
...
}
CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(CMyThread));

3)线程的结束

    对于worker thread,执行线程函数return,执行线程也就结束了。或者执行线程函数也可以调用AfxEndThread,结束一个执行线程。

    UI执行线程因为有消息循环的关系,必须在消息队列中放一个WM_QUIT,才能结束执行线程。放置的方式和一般Win32程序一样,调用::PostQuitMessage 即可办到。亦或者,在执行线程的任何一个函数中调用AfxEndThread,也可以结束执行线程。

    不论worker thread UI thread,都需要一个CWinThread 对象,当执行线程结束,记得把该对象释放掉(利用delete)。

参考

[1] 深入浅出MFC


推荐阅读
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
author-avatar
c_陈可儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有