• AfxBeginThread深入解析


      看过《深入浅出MFC》书中,j.j.hou提到在创建新的线程时,最好不要直接使用CreateThread,虽然AfxBeginThread也是对CreateThread的封装,但是AfxBeginThread这个API做了很多创建线程的基础工作:调用CWinThread* pThread = (CWinThread*)pThreadClass->CreateObject(),利用C++运行时库创建类对象并得到对象指针。

      需要注意的是获取的指针被强制转换成CWinThread*,并返回这个指针,那么我们在接收的时候完全可以将这个指针强制转换回来,因为内存模型是我们的CWinThread派生类,所以不会发生错误,而且可以调用这个派生类的方法及可以访问资源等操作。比如调用CWinThread的派生类对象的PostThreadMessage()方法,当然前提是这个线程是UI线程,如果是WORKER线程也就没必要了。接收消息的时候要使用ON_THREAD_MESSAGE()接收,当然可以在PreTranslateMessage()中捕获其他线程发送的消息。

      下面来看看类的继承图:

      

      可以看到CWinThread类继承自CCmdTarget,又从CWinThread派生了CWinApp,我们知道,一个应用程序中有且只能有一个CWinApp,他代表我们应用程序本身,但是并没说一个应用程序只能有一个CWinThread,多个CWinThread代表多个线程,是的CWinThread就是代表一个线程本身。当我们的应用程序需要多个线程时,我们就要产生一个CWinThread对象并保存它的指针。但要保证CWinApp只能有一个。另外所有继承自CCmdTarget的类都有一种处理命令消息的能力:菜单点击,加速键等消息,而所有继承自CObject的类有另外两种能力:动态产生对象和序列化。

      说到底,从CWinThread派生一个UI线程,这个线程和我们的主线程(CWinApp所在线程)没有什么区别,他也有一个消息循环,线程开始之前 也要经过virtual BOOL InitInstance();的洗礼。当然我们可以在这个函数中做一些初始化工作,就像CWinApp一样。

      

  • 相关阅读:
    [dll注入实现IAT勾取] 计算器显示中文
    [记事本API Hook] 调试器 勾取 WriteFile()Api
    [DLL注入的方法]进程创建期修改PE输入表法
    [DLL注入的方法]静态修改PE输入表法
    [1]编程实现加载驱动
    [保护模式]测试一致代码段
    [保护模式]联系1 三环访问高2G
    15.[保护模式]TSS任务门
    ERP中HR模块的操作与设计--开源软件诞生26
    ERP的主数据的操作与设计--开源软件诞生25
  • 原文地址:https://www.cnblogs.com/xiejiulong/p/3831544.html
Copyright © 2020-2023  润新知