1. 程式人生 > >深度解析MFC執行緒及機制

深度解析MFC執行緒及機制

在VC中,啟動一執行緒有3種方式:

1.使用MFC中啟動一個執行緒一般使用AfxBeginThread函式;

2.使用API則使用CreateThread;

3.就是使用_beginthread和_beginthreadex兩個函式。

使用MFC的AfxBeginThread函式啟動一個執行緒,不管你代入的引數是否是個從CWinThread繼承來的執行緒類還是一以標準的執行緒函式地址及引數(UINT ThreadProc(LPVOID pParam)的形式),都返回了一CWinThread指標方便了我們使用。但其中的機理沒有在哪本書上有人仔細分析過,沒辦法只好檢視MFC原始碼了。經過分析,現將分析的結果與大家分享。:)

在CWinThread類中有兩個建構函式:

一為預設的構造,還有一個為一標準執行緒函式地址和輸入引數的建構函式-
CWinThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam)。當我們使用AfxBeginThread啟動一個執行緒時,無外2種方法:
 1.直接啟動已CWinThread為基類的執行緒類-AfxBeginThread(RUNTIME_CLASS(...),...);
 2.直接啟動標準的執行緒函式-AfxBeginThread((AFX_THREADPROC),LPVOID ,....);

還有一種方法可能大家不常用,就是以CWinThread繼承一執行緒類,在記憶體中new,然後呼叫CWinThread的成員函式CreateThread來啟動自身;
經過我的分析,實際上第1種和第2種方法就是第3中方法的詳細化,呼叫更加靈活,但1、2種比起來要方便些。:)
實際上AfxBeginThread根據引數實現建立一CWinThread執行緒:若引數為一標準的執行緒函式地址,則new一CWinThread物件,以函式地址及引數構造;若引數為一CWinThread繼承過來的類則直接呼叫CRunTimeClass的CreateObject建立一CWinThread物件,以預設引數構造。然後呼叫CreateThread成員函式,呼叫不成功便呼叫Delete(),判斷是否設定了自我刪除物件(m_bAutoDelete = TRUE),為真則刪除自身。

在CreateThread函式中,首先建立2個事件,MFC利用_beginthreadex啟動一名為_AfxThreadEntry的全域性執行緒函式,並通過一_AFX_THREAD_STARTUP結構體將一系列引數傳入,然後等待_AfxThreadEntry將一執行緒初始化完畢設定事件1狀態為止,然後自己設定另一個事件2狀態,觸發_AfxThreadEntry中的程式碼;在_AfxThreadEntry中,函式首先通過一系列函式初始化執行緒,再設定事件1狀態後等待CWinThread的CreateThread執行完畢後的事件2,這時判斷_AFX_THREAD_STARTUP中的執行緒函式地址是否為空,若不為空就直接執行函式程式碼;若不為空就執行CWinThread的InitInstance判斷是否返回為TRUE,是的話就進入訊息迴圈知道傳送給執行緒WM_QUIT訊息為止;若返回為FALSE,就呼叫ExitInstance;最後都呼叫AfxEndThread結束執行緒。而AfxEndThread則從模組中先取得CWinThread*型別的指標判斷是否為NULL,否的話則呼叫CWinThread的Delete來將CWinThread從記憶體中刪除。

以下是簡易流程圖:

AfxBeginThread:

AfxBeginThread流程

AfxBeginThread流程

_AfxThreadEntry流程

_AfxThreadEntry流程

希望對大家有用!

相關推薦

深度解析MFC執行機制

在VC中,啟動一執行緒有3種方式: 1.使用MFC中啟動一個執行緒一般使用AfxBeginThread函式; 2.使用API則使用CreateThread; 3.就是使用_beginthread和_be

深度解析Java執行池的異常處理機制

前言 今天小夥伴遇到個小問題,執行緒池提交的任務如果沒有catch異常,那麼會拋到哪裡去,之前倒是沒研究過,本著實事求是的原則,看了一下程式碼。 正文 小問題 考慮下面這段程式碼,有什麼區別呢?你可以猜猜會不會有異常打出呢?如果打出來的話是在哪裡?: ExecutorSe

深度解析執行帶來的Android效能優化原理

Android 開發中多執行緒的必要性; Android 開發中,許多操作都需要由 主執行緒(UI 執行緒)來執行,比如: 系統事件(例如裝置狀態變動) 輸入事件 服務 鬧鐘 UI 繪製 … 我們經常需要針對這些情況編寫程式碼。 由於主執行緒只有一個

java基礎常見問題解析(六) 執行+併發機制

java執行緒+併發機制 有關執行緒的哪些敘述是對的 a. 一旦一個執行緒被建立,它就立即開始執行(需要等待CPU排程) b. 當一個執行緒因為搶先機制而停止執行,它被放在可執行佇列的前面 c

Android訊息機制原理,仿寫Handler Looper原始碼解析執行通訊原理--之仿寫模擬Handler(四)

前篇總結:上一篇實現了用Looper管理訊息佇列和訊息迴圈,但是訊息的傳送和訊息處理都是在Looper中進行的。寫一個子執行緒使用這樣的Looper怎麼才能獲取到loop()死迴圈訊息佇列取出的訊息呢?用回撥!callBack! 第四節 仿寫Handler來發送訊息,實現回

再次學習MFC執行同步

一、MFC對多執行緒程式設計的支援   MFC中有兩類執行緒,分別稱之為工作者執行緒和使用者介面執行緒。二者的主要區別在於工作者執行緒沒有訊息迴圈,而使用者介面執行緒有自己的訊息佇列和訊息迴圈。  工作者執行緒沒有訊息機制,通常用來執行後臺計算和維護任務,如冗長的計算過程,印表機的後臺列印等。使用者介面執行

一起分析執行的狀態執行通訊機制

> 本文在個人技術部落格同步釋出,詳情可[**用力戳**](http://www.17coding.info/article/27) > 亦可掃描螢幕右側二維碼關注個人公眾號,公眾號內有個人聯絡方式,等你來撩...   多執行緒程式設計一直是普通程式設計師進階為高階程式設計師的必備技

java面試/筆試題目之多執行鎖 (持續更新中)

前言:這一模組可以參照徐劉根大佬的部落格。 一.執行緒和程序的概念、並行和併發的概念 1.程序:是計算機中的程式關於某資料集合上的一次執行活動,是系統 進行資源分配和排程的基本單位,是作業系統結構的基礎。程式是指令、資料及其組織形式的描述,程序是程式的實體。 2.執行緒:是程式執行流的

程序和執行Linux下的程式設計

程序和執行緒及Linux下的程式設計 一、概述 程序和執行緒網路上有一堆解釋,我不喜歡抄襲,也不喜歡套用太教科書的說法。就以我自己的理解來說說程序和執行緒吧,當然自己的理解肯定不是很嚴謹,但是理解起來應該會比教科書快一點。程序和執行緒都可以認為是併發執行程式,但是隻有多處理器下的多執行緒

java-執行NIO淺談

這裡簡單談一下執行緒,但是要把一個執行緒談好,要結合NIO,結合鎖機制一起學習,記憶才會深刻。所以,以下說明。結合這三個方面的執行緒和NIO進行談談,鎖部分另外再談。 1、程序 1.1概念 程序=程式+執行。當把一個程式從磁碟中載入到記憶體中,cpu去運算和處理這個程序(執行起來

Java基礎之多執行併發庫

實際上關於多執行緒的基礎知識,前面自己已經總結過一部分,但是每一個階段對於同樣知識點的學習側重點是不一樣的,前面的Java基礎總結八之多執行緒(一)和 Java基礎總結九之多執行緒(二)是對JDK5以前多執行緒相關基礎知識的一個簡單總結,今天本文將偏重於JDK5提供的併發庫進行學習總結。 首先,

聊聊C++執行同步機制

  執行緒同步是一個經常出現的場景,考慮一個生產者消費者模式,一個執行緒作為生產,一個執行緒作為消費。生產者往一個佇列中加入元素,消費者往一個佇列中取元素。實現對一個公共區域的同時訪問操作,是C++多執行緒經常會遇到的問題,所以C++提供了執行緒同步的機制。   1.消費者輪

利用web work實現多執行非同步機制,打造頁面單步除錯IDE

我們已經完成了整個編譯器的開發,現在我們做一個能夠單步除錯的頁面IDE,完成本章程式碼後,我們可以實現下面如圖所示功能: 頁面IDE可以顯示每行程式碼所在的行,單擊某一行,在改行前面會出現一個紅點表示斷點,點選Parsing按鈕後,進入單步除錯模式,然後每點一次step按鈕,頁

Python佇列與多執行檔案鎖

佇列實現生產-多執行緒消費 先看程式碼 # -*- coding: utf-8 -*- import queue import threading mu = threading.Lock() class Producer(threading.Thread): def __init__(

C#關於多執行執行同步 lock鎖的應用

Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

Linux多執行同步機制

一、互斥鎖 儘管在Posix Thread中同樣可以使用IPC的訊號量機制來實現互斥鎖mutex功能,但顯然semphore的功能過於強大了,在Posix Thread中定義了另外一套專門用於執行緒同步的mutex函式。 1. 建立和銷燬    有兩種方法建

執行建立執行的三種方法

基本概念 程式:是為了完成特定任務,用某種語言編寫的一組指令的集合.即指一段靜態程式碼。 程序:程序是程式的一次執行過程,是系統進行資源分配和處理機排程的一個獨立單位。 程式是一個靜態的概念,程序是一個動態的概念。一個程式多次執行,對應多個程序;不同的程序可以包含同一程式。 執行緒:

java synchronize - 執行同步機制

Java支援同步機制的是Monitor。Monitor就像是擁有一個特殊房間的建築,在同一時間裡,這間特殊的房間只能被一個執行緒擁有。 enter the monitor:進入這幢建築 acquiring the monitor:進入建築裡的特殊房間 owning t

Android多執行通訊機制

掌握Android的多執行緒通訊機制,我們首先應該掌握Android中程序與執行緒是什麼。 1. 程序 在Android中,一個應用程式就是一個獨立的程序(應用執行在一個獨立的環境中,可以避免其他應用程式/程序的干擾)。一般來說,當我們啟動一個應用程式時,系統會建立一個程序(從Zygote中

Python中的多執行程式設計,執行安全與鎖(一) 聊聊Python中的GIL 聊聊Python中的GIL python基礎之多執行機制 python--threading多執行總結 Python3入門之執行threading常用方法

1. 多執行緒程式設計與執行緒安全相關重要概念 在我的上篇博文 聊聊Python中的GIL 中,我們熟悉了幾個特別重要的概念:GIL,執行緒,程序, 執行緒安全,原子操作。 以下是簡單回顧,詳細介紹請直接看聊聊Python中的GIL  GIL:&n