zoukankan      html  css  js  c++  java
  • 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一样。

      

  • 相关阅读:
    2. Redis哨兵、复制、集群的设计原理与区别
    1. 详解Redis的存储类型、集群架构、以及应用场景
    博客园主题优化
    【Java基础】Java面试题精选
    【Java集合】——集合类分析总结
    新零售供应链的三大闭环
    Comparable和Comparator比较实现排序 场景分析
    Java基础-枚举类
    Java基础-泛型
    微服务架构~BFF和网关
  • 原文地址:https://www.cnblogs.com/xiejiulong/p/3831544.html
Copyright © 2011-2022 走看看