基於MFC的執行緒函式程式設計

2021-10-04 18:21:29 字數 4653 閱讀 9512

int cnt =0;

//計數器

int terminal_flag =0;

//stop標誌

cwinthread *m_pthread;

//執行緒名

static uint jisuan

(lpvoid pparam)

;//執行緒函式

新增的執行緒函式如下,利用this指標指向計數器cnt,顯示到edit control中,並增加cnt的值:

uint cmfc_thread_2dlg::

jisuan

(lpvoid lpparam)

return0;

}

該執行緒函式的呼叫採用afxbeginthread()函式,引數主要是執行緒函式名jisuan和傳遞引數this:

m_pthread =

afxbeginthread

( jisuan,

this

, thread_priority_normal,0,

0,null

);

完整的.h和.cpp檔案如下所示:

.**件:

// mfc_thread_2dlg.h : 標頭檔案

//#pragma once

#include

"afxwin.h"

#define wm_update_static (wm_user + 100)

//added

// cmfc_thread_2dlg 對話方塊

class

cmfc_thread_2dlg

:public cdialogex

;protected

:virtual

void

dodataexchange

(cdataexchange* pdx)

;// ddx/ddv 支援

//static uint jisuan(lpvoid lpparam);

// 實現

protected

: hicon m_hicon;

// 生成的訊息對映函式

virtual bool oninitdialog()

; afx_msg void

onsyscommand

(uint nid, lparam lparam)

; afx_msg void

onpaint()

; afx_msg hcursor onquerydragicon()

;declare_message_map()

public

: afx_msg void

onbnclickedstart()

; afx_msg void

onbnclickeddialog()

; cedit m_text;

//int cnt =0;

//計數器

int terminal_flag =0;

//stop標誌

cwinthread *m_pthread;

//執行緒名

static uint jisuan

(lpvoid pparam)

;//執行緒函式

afx_msg void

onbnclickedstop()

; afx_msg void

onbnclickedstep()

;};

cpp檔案:

// mfc_thread_2dlg.cpp : 實現檔案

//#include

"stdafx.h"

#include

"mfc_thread_2.h"

#include

"mfc_thread_2dlg.h"

#include

"afxdialogex.h"

#ifdef _debug

#define new debug_new

#endif

// 用於應用程式「關於」選單項的 caboutdlg 對話方塊

class

caboutdlg

:public cdialogex

;protected

:virtual

void

dodataexchange

(cdataexchange* pdx)

;// ddx/ddv 支援

// 實現

protected

:declare_message_map()

};caboutdlg::

caboutdlg()

:cdialogex

(caboutdlg::idd)

void caboutdlg::

dodataexchange

(cdataexchange* pdx)

begin_message_map

(caboutdlg, cdialogex)

end_message_map()

// cmfc_thread_2dlg 對話方塊

cmfc_thread_2dlg::

cmfc_thread_2dlg

(cwnd* pparent /*=null*/):

cdialogex

(cmfc_thread_2dlg::idd, pparent)

void cmfc_thread_2dlg::

dodataexchange

(cdataexchange* pdx)

begin_message_map

(cmfc_thread_2dlg, cdialogex)

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

on_bn_clicked

(idc_start,

&cmfc_thread_2dlg::onbnclickedstart)

on_bn_clicked

(idc_dialog,

&cmfc_thread_2dlg::onbnclickeddialog)

on_bn_clicked

(idc_stop,

&cmfc_thread_2dlg::onbnclickedstop)

on_bn_clicked

(idc_step,

&cmfc_thread_2dlg::onbnclickedstep)

end_message_map()

// cmfc_thread_2dlg 訊息處理程式

bool cmfc_thread_2dlg::

oninitdialog()

}// 設定此對話方塊的圖示。 當應用程式主視窗不是對話方塊時,框架將自動

// 執行此操作

seticon

(m_hicon, true)

;// 設定大圖示

seticon

(m_hicon, false)

;// 設定小圖示

// todo: 在此新增額外的初始化**

//m_pthread = afxbeginthread((afx_threadproc)jisuan, this);

return true;

// 除非將焦點設定到控制項,否則返回 true

}void cmfc_thread_2dlg::

onsyscommand

(uint nid, lparam lparam)

else

}// 如果向對話方塊新增最小化按鈕,則需要下面的**

// 來繪製該圖示。 對於使用文件/檢視模型的 mfc 應用程式,

// 這將由框架自動完成。

void cmfc_thread_2dlg::

onpaint()

else

}//當使用者拖動最小化視窗時系統呼叫此函式取得游標

//顯示。

hcursor cmfc_thread_2dlg::

onquerydragicon()

//執行緒函式

uint cmfc_thread_2dlg::

jisuan

(lpvoid lpparam)

return0;

}//開始執行緒,進行累加顯示

void cmfc_thread_2dlg::

onbnclickedstart()

//暫停、繼續執行緒

void cmfc_thread_2dlg::

onbnclickeddialog()

else

}//停止執行緒

void cmfc_thread_2dlg::

onbnclickedstop()

//單步增加累加器的值並顯示

void cmfc_thread_2dlg::

onbnclickedstep()

}

剛開始上網搜怎麼通過afxbeginthread()函式建立執行緒,以及怎麼通過執行緒函式呼叫全域性變數和修改介面上控制項的值時,一直找不到現成的網路資料,直到找到乙個this指標的部落格,才知道是通過自己定義的執行緒函式和需要傳遞的引數作為afxbeginthread()函式的輸入引數來實現的。

MFC 下 執行緒程式設計的呼叫執行緒外的函式方法

腦中有兩個解決的方法,作戰一 去m owndlg函式中初始化函式cdialogex裡面新增乙個m ownlist的設定。但是卡殼咯 於是作戰二 設定訊息,通過訊息來解決。所以先說說訊息的使用。先自定義乙個訊息 define wm reload wm user 100 然後 修改reload的引數,改...

MFC多執行緒程式設計

具體來說是 在mfc中呼叫attach的時候 有個巨集叫assert valid 這個方法不允許訪問非本執行緒建立的繼承於。在cwnd函式裡面有乙個valid 的靜態方法,檢測當前執行緒的mfc物件指標,是否在當前執行緒的map中 下面就是這個模組中線程狀態結構體 afx module thread...

MFC 多執行緒程式設計

mfc中有兩類執行緒 分別稱之為工作者執行緒和使用者介面執行緒 二者的主要區別在於工作者執行緒沒有訊息迴圈 而使用者介面執行緒有自己的訊息佇列和訊息迴圈 但對於 win32 的 api 程式設計而言 這兩種執行緒是沒有區別的 它們都只需執行緒的啟動位址即可啟動執行緒來執行任務 在mfc中 一般用全域...