线程中不能用updatedata()的解决办法

来源:互联网 发布:阿里云风云令更换手机 编辑:程序博客网 时间:2024/05/17 22:28

用sendmessage的方式解决(菜鸟步骤)

1、在主窗体头文件中用下列函数注册windows消息

const UINT WM_MYUPDATEDATA = ::RegisterWindowMessage(_T("MyUpdateData"));

2、在主窗体头文件中的消息映射函数申明处添加下列映射

afx_msg void OnUpdateMyData(WPARAM wp, LPARAM lp);

3、在主窗体cpp文件中添加注册函数在END_MESSAGE_MAP()之前

ON_REGISTERED_MESSAGE(WM_MYUPDATEDATA,OnUpdateMyData)

4、在主窗体cpp文件中添加函数

void CDlg::OnUpdateMyData(WPARAM wp,LPARAM lp)
{
    UpdateData(wp);
}
5、在所用线程中添加更新函数消息,即进行了updatedata()

pDlg->SendMessage(WM_MYUPDATEDATA,true);

 

MFC线程中不能用UpdateData,怎么解决(详细).

获得句柄,通过GetWindowText( HWND, buffer, len );得到控件内容。可以把父窗口指针作为参数传到线程里来获取句柄。同理,可以通过SetWindowText设置内容。

比如传入的是对话框的指针pDlg,比如你已知ID,那么设置如下:pDlg->GetDlgItem( ID )->SetWindowText("你要设置的东西");

另一种方法是消息处理,自定义消息,然后线程内PostMessage和参数,在你的外部来处理该消息。

补充:
1、HWND hWnd = ( CWnd* )pWnd->GetDlgItem( ID );
2、线程函数定义如下UINT WINAPI WorkThread( 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 WINAPI WorkThread( LPVOID lpContext ); 应用时可以这样,
CYourDlg dlg;
CreateThread(...,(参数)(LPVOID) &dlg );

在函数里这样写:

CYourDlg* pDlg = ( CYourDlg* ) lpContext;
if ( pDLg )
{
HWND hWnd = pDlg->GetDlgItem( 控件ID );
PostMessage( hWnd, WM_YOURMSG, pstr, 0 );
}

 

在线程中通过发送消息UpdateData界面

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