→ bluesoul: 誰沒有對應的建構式? 09/30 10:09
新建立的struct
typedef struct _Thread_Para_Struct
{
...
Delegate<void, int> fp_fun_in_struct;
} ThreadParaStruct;
這個struct是我準備把MainThread要Create New Thread時,
把MainThread一些變數整理起來,傳給New Thread的東西。
我想了一下問題應該是在於這一行
Delegate<void, int> fp_fun_in_struct;
是否因為Delegate是寫template,所以struct需要一個由template建構的建構式呢?
謝謝。
※ 編輯: Keitaro (61.220.247.138), 09/30/2014 10:20:51
剛才開一個新的proj MFCApplication6Dlg來測試,大概找到問題點。
程式碼如底下連結
//NewThread.h
http://codepad.org/HsORebrk
//NewThread.cpp
http://codepad.org/vsANxEvk
//MFCApplication6Dlg.h
http://codepad.org/IBI50uBC
//MFCApplication6Dlg.cpp
http://codepad.org/wDFFZiDn
//Delegate.h
http://codepad.org/TK2sEt8W
我在準備建立NewThrad前,把MainDlg要傳給NewThread的變數整理在struct裡面,
再把struct傳過去,所以我在NewThread物件裡面放一個struct來接。
ThreadParaStruct thread_para;
原本預定是,按下Button1按鈕後,MainDlg先建立struct物件並初始化
Delegate<void, CString> d1_fp(this, &CMFCApplication6Dlg::fun);
ThreadParaStruct StructPara(d1_fp);
把Delegate物件d1_fp傳給struct跑建構式
ThreadParaStruct(Delegate<void, CString> fp_obj) : fp_fun(fp_obj)
{}
然後建立NewThread跑底下這建構式
CNewThread::CNewThread(ThreadParaStruct para_struct) :
thread_para(para_struct)
{}
但是Compiler判斷NewThread預設的建構式無法初始化struct物件出錯。
請問該怎麼修改這問題呢?
另外請教一點,請問為何struct裡面的Delegate物件,
一定要寫一個新個建構式來對他初始化呢?
我測試如果我改放一個std::map物件,不需要寫新的建構式,
這差異是為什麼呢?
謝謝。
※ 編輯: Keitaro (114.37.157.65), 09/30/2014 13:51:02
推 carylorrk: 不是很懂你的問題,看一開始的 code 直覺是你的 10/02 11:01
→ carylorrk: MainThreadObj::fun 跟文章中的 Delegate 要的參數不同 10/02 11:02
→ carylorrk: 啊XD? 其實現在最簡單的方式是 std::function? 10/02 11:02
→ carylorrk: 還有放 map 的意思是? delegate 的目的就是用起來像是 10/02 11:04
→ carylorrk: class 本身的函式,但是實際其實交給其他人來做不是嗎 10/02 11:05
→ carylorrk: 因爲不懂 MFC 也沒有 Windows,無法跑跑看 XDD 10/02 11:05
推 firose: 我不懂這一個 Delegate<> 跟執行緒間安全地溝通有何關聯? 10/02 11:53
→ carylorrk: 同上XD 10/02 14:18
非常感謝以上兩位的指教。
原本舊有的連結只是寫大綱,後來我覺得直接開一個proj把問題寫出來PO上來比較完整。
舊有的連結拿掉,請直接看推文底下的那些範例檔。
小弟我還是菜鳥,如果觀念有誤的話還請各位指點^^
我的想法是這樣的:
當MainThread建立NewThread後,可能要等待NewThread告知MainThread一些事件。
比方說NewThread已經結束,需要MainThread把按鈕彈起來之類的。
我搜尋資料後看到作法有幾種
1. PostThreadMessage
兩個thread彼此之間知道對方的ThreadID,
使用發送thread msg的方式告知對方要做什麼。
2. MainThread事先將自己的Function包成function pointer,然後傳給NewThread
如此一來,NewThread就可以直接用function pointer做事,
直接呼叫MainThread的把按鈕彈起來的function call。
我採用的方法是第二種。
我的想法是,先用cjcat2266版友所寫的Delegate template class包function pointer,
然後把Delegate物件放在struct裡面,在NewThread初始化時直接丟過去。
以上的想法不知道有沒有錯?
有錯的話還請各位先進指點。
感激不盡。
※ 編輯: Keitaro (61.220.247.133), 10/03/2014 16:29:18