用sendmessage的方式解決(菜鳥步驟)
1、在主窗體標頭檔案中用下列函式註冊windows訊息
const uintwm_myupdatedata = ::registerwindowmessage(_t("myupdatedata"));
2、在主窗體標頭檔案中的訊息對映函式申明處新增下列對映
afx_msg lresult onupdatemydata(wparam wp, lparam lp);
3、在主窗體cpp檔案中新增註冊函式在end_message_map()之前
on_registered_message(wm_myupdatedata,onupdatemydata)
4、在主窗體cpp檔案中新增函式
voidcdlg::onupdatemydata(wparam wp,lparam lp)
5、在所用執行緒中新增更新函式訊息,即進行了updatedata()
pdlg->sendmessage(wm_myupdatedata,true);
首先,把原來的訊息函式返回值型別改為lresult,函式內可以隨便寫個return true; 然後訊息函式的引數必須改寫成(wparamwparam,lparam lparam)而不論這兩個引數是否用得到;最後,訊息對映如on_message
(wm_message,& onmymessage)
mfc執行緒中不能用updatedata,怎麼解決(詳細).
獲得控制代碼,通過getwindowtext( hwnd, buffer, len );得到控制項內容。可以把父視窗指標作為引數傳到執行緒裡來獲取控制代碼。同理,可以通過setwindowtext設定內容。
比如傳入的是對話方塊的指標pdlg,比如你已知id,那麼設定如下:pdlg->getdlgitem( id)->setwindowtext("你要設定的東西");
另一種方法是訊息處理,自定義訊息,然後執行緒內postmessage和引數,在你的外部來處理該訊息。
補充:
1、hwnd hwnd = ( cwnd*)pwnd->getdlgitem( id );
2、執行緒函式定義如下uint winapiworkthread( lpvoid lpcontext ); 應用時可以這樣,
cyourdlg dlg;
createthread(...,(引數)(lpvoid)&dlg );
在函式裡這樣寫:
cyourdlg* pdlg = ( cyourdlg* ) lpcontext;
if ( pdlg )
獲得控制代碼,通過getwindowtext( hwnd, buffer, len );得到控制項內容。可以把父視窗指標作為引數傳到執行緒裡來獲取控制代碼。同理,可以通過setwindowtext設定內容。
比如傳入的是對話方塊的指標pdlg,比如你已知id,那麼設定如下:pdlg->getdlgitem( id )->setwindowtext("你要設定的東西");
另一種方法是訊息處理,自定義訊息,然後執行緒內postmessage和引數,在你的外部來處理該訊息。
補充:
1、hwnd hwnd = ( cwnd*)pwnd->getdlgitem( id );
2、執行緒函式定義如下uint winapiworkthread( lpvoid lpcontext ); 應用時可以這樣,
cyourdlg dlg;
createthread(...,(引數)(lpvoid)&dlg );
在函式裡這樣寫:
cyourdlg* pdlg= ( cyourdlg* ) lpcontext;
if ( pdlg )
C 跨執行緒呼叫
問題 執行一下 報錯 大概意思就是跨執行緒操作,label沒法兒賦值 1.private void mainloop 8.解決方案 一 在5 6行中間新增以下 checkforillegalcrossthreadcalls false 禁止編譯器對跨執行緒訪問做檢查 二 使用deletgate in...
C 跨執行緒呼叫
private thread mythread private void form1 load object sender,eventargs e private void runsonworkerthread 如果您在 net framework 1.0版本中嘗試執行這段 也許會僥倖執行成功,或者...
C 跨執行緒呼叫控制項
在c 應用程式開發中,我們經常需要把ui執行緒和工作執行緒分開程式設計,為了防止介面停止響應。同時,我們也需要在工作執行緒中去更新ui介面的控制項,在clr的執行緒安全中並不允許我們直接在工作執行緒操作ui介面。因此,介紹以下三種方式進行跨執行緒操作ui。private void button2 c...