C++ 跨线程调用UpdateData

用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)
{
    UpdateData(wp);
}
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 ) 

HWND hWnd = pDlg->GetDlgItem( 控件ID); 
PostMessage( hWnd, WM_YOURMSG, pstr, 0 ); 
}

 

获得句柄,通过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 ) 

HWND hWnd = pDlg->GetDlgItem( 控件ID); 
PostMessage( hWnd, WM_YOURMSG, pstr, 0 ); 
}

 

12月26日在线程中通过发送消息UpdateData界面1.自定义消息:#define WM_UPDATEDATA  10000+1  // 更新界面 2.添加消息映射: ON_MESSAGE(WM_UPDATEDATA, OnUpdateData)
3.定义消息处理函数:LRESULTCDlg::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
 UpdateData(wParam);
 return 0;
} 4.在线程中发送消息:    首先获取主窗口的指针     CDlg* pMain =(CDlg*)param;     SendMessage(pMain->m_hWnd,WM_UPDATEDATA, FALSE, FALSE); 完成,该方法可以解决在线程中直接调用UpdateData产生错误的问题.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值