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

文章详细介绍了在MFC线程环境下如何通过注册自定义消息、消息映射和发送消息的方式解决UpdateData()函数无法正常工作的问题。通过自定义消息和PostMessage函数,实现在线程中安全地更新UI元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转自http://hi.baidu.com/xiaoqiangswust/item/f9ea3c8f296d9bdf5f0ec1e7

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

用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 );
}

 

 

 

12月26日在线程中通过发送消息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产生错误的问题.
<think>我们正在讨论VC++ 6.0中UpdateData函数的用法或问题。根据引用内容,UpdateData是MFC中用于对话框数据交换(DDX)和验证(DDV)的关键函数。下面我将详细解释其用法和常见问题。</think>### VC++ 6.0 中 UpdateData 方法详解 `UpdateData()` 是 MFC 框架中实现对话框数据交换(DDX)的核心方法,用于在对话框控件和成员变量之间同步数据。其工作原理如下: #### 1. **基本语法** ```cpp BOOL UpdateData(BOOL bSaveAndValidate = TRUE); ``` - **TRUE**: 从控件读取数据到成员变量(提交数据) - **FALSE**: 将成员变量的值更新到控件(初始化控件) #### 2. **典型使用场景** - **初始化对话框**(在 `OnInitDialog` 中): ```cpp BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); UpdateData(FALSE); // 成员变量 -> 控件 return TRUE; } ``` - **提交数据**(在按钮事件中): ```cpp void CMyDialog::OnOK() { UpdateData(TRUE); // 控件 -> 成员变量 if(ValidateData()) // 自定义验证 CDialog::OnOK(); } ``` #### 3. **常见问题与解决方案** - **数据未更新**: - 原因:未正确绑定控件变量(通过 ClassWizard 绑定变量) - 解决:检查 `DoDataExchange` 中的 `DDX_Text` 等绑定代码[^3] ```cpp void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_strValue); // 控件绑定 } ``` - **验证失败**: - 原因:DDV 验证规则不满足(如数值超出范围) - 解决:检查 `DoDataExchange` 中的 `DDV_MinMaxDouble` 等验证规则 ```cpp DDV_MinMaxDouble(pDX, m_dValue, 0, 100); // 验证0-100范围 ``` - **无限递归**: - 原因:在 `DoDataExchange` 中调用 `UpdateData()` - 解决:禁止在 `DoDataExchange` 内调用此方法[^4] - **模态对话框生命周期**: - 框架自动调用时序: - `OnInitDialog` 后自动调用 `UpdateData(FALSE)` - `OnOK` 内自动调用 `UpdateData(TRUE)`[^4] #### 4. **最佳实践** 1. **绑定变量**:通过 ClassWizard 为控件关联成员变量(如 `CEdit` → `CString m_strText`) 2. **数据流控制**: - 初始化界面:`UpdateData(FALSE)` - 提交数据:`UpdateData(TRUE)` 3. **自定义验证**:在 `UpdateData(TRUE)` 后添加业务逻辑验证 4. **避免手动调用**:非必要情况不直接调用,依赖框架自动管理 > **关键提示**:当使用 `UpdateData(TRUE)` 后,若对话框未关闭(如验证失败),需显式调用 `UpdateData(FALSE)` 重新加载原始数据[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值