C 如何在類中建立執行緒

2021-10-22 17:26:35 字數 1636 閱讀 2747

一般我們在啟執行緒時,都是把執行緒函式寫成全域性函式來使用,但是如果要把執行緒操作寫成類,執行緒函式放在類裡面在c++編譯會不通過。

在c++類中建立執行緒會有報錯:

下面以乙個簡單的類進行舉例

external.**件

#ifndef _radio_external_h_

#define _radio_external_h_

class

cradiotask

:public ctaskbase

;#endif

在external.cpp檔案的成員函式中直接建立執行緒會導致編譯不通過

在建立執行緒的api 中傳入的執行緒函式需要在編譯時確定位址,如果是普通的類函式,編譯時不能確定位址,需要建立類的物件才能獲取。把執行緒的執行函式寫成static 函式,或者是全域性函式,函式位址在編譯時是確定的當writenetmessage為成員函式時,cradiotask 繼承ctaskbase類的建立執行緒函式,在ctaskbase類中將執行緒的執行函式taskfunc定義為靜態函式。

在類中定義執行緒函式,但是需要將執行緒函式定義為靜態的。

class

ctaskbase

;virtual

~ctaskbase()

;//執行緒啟動

intstart()

protected

: thread_id m_threadid;

//將執行緒的執行函式定義為靜態類

static

inttaskfunc

(void

*lpparam)

virtual

intrun()

=0;}

;//cradiotask 繼承 ctaskbase

class

cradiotask

:public ctaskbase

;// main.cpp

intmain()

當writenetmessage為全域性函式時,

將要傳入執行緒的函式,寫成全域性函式,不作為類的成員;然後把類的例項(ptask)作為引數傳入執行緒中要呼叫的函式(writenetmessage),這樣就可以呼叫類中的成員函式和變數(m_taskname,m_connectstatus)了。

int

writenetmessage

(cradiotask* ptask,byte *pbuffer, ushort ulen)

}return ireval;

}int cradiotask::

run(

)

參考:

如何在工作執行緒中建立視窗?

在前面我們研究了使用afx manage state afxgetstaticmodulestate 進行 dll間的資源切換,以及工作執行緒中建立 windows 訊息迴圈的原理,以為就可以搞定一切類似問題了 但是請看以下 dword ctestmfcdlg threadfunc pvoid yy...

如何在工作執行緒中建立視窗?

在前面我們研究了使用afx manage state afxgetstaticmodulestate 進行 dll間的資源切換,以及工作執行緒中建立 windows 訊息迴圈的原理,以為就可以搞定一切類似問題了 但是請看以下 dword ctestmfcdlg threadfunc pvoid yy...

如何在工作執行緒中建立視窗?

在前面我們研究了使用afx manage state afxgetstaticmodulestate 進行 dll間的資源切換,以及工作執行緒中建立 windows 訊息迴圈的原理,以為就可以搞定一切類似問題了 但是請看以下 dword ctestmfcdlg threadfunc pvoid yy...