看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC2008 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) MFC 問題(Question): 在multithread下,使用delegate的方法讓thread之間溝通 程式碼(Code):(請善用置底文網頁, 記得排版) 請看底下推文的連結 補充說明(Supplement): 各位好,不好意思小弟我又上來請教各位先進了。 自從換工作學著寫MFC後,最近開始學著寫multithread。 一開始寫的時候不知道危險,在MainThread建立新的CWinThread時, 直接把MainThread的物件位址丟給CWinThread物件接, 雖然要存取MainThread物件時都有先做Lock/Unlock, 但找了相關資料覺得這寫法太危險了, 學習採用Delegate的寫法。 搜尋版上的文章後,看到cjcat2266版友分享的文章 http://allenchou.net/2012/04/easy-c-delegates/ 我將cjcat2266版友這網址的程式碼,除了demo sample code以外, copy到一個Delegate.h的檔案。 程式碼大綱如上面的網址所示。 結果Complier跟我說,建立struct時,沒有對應的建構式。 struct ThreadParaStruct在還沒有加入Delegate物件這一行 Delegate<void, int> fp_fun_in_struct; 之前,compiler是過的了的。 請問這邊該怎麼改呢?謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.157.65 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1412007458.A.90A.html
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