|
在 MFC 中,如果您希望从一个线程中获取异步返回值,可以通过几种方式实现。以下是一些常见的方法:
### 方法一:使用全局变量或类成员变量
您可以在类中定义一个成员变量来存储线程的返回值,然后在线程函数中设置这个变量。在主线程中,您可以访问这个变量。
- class CMyDialog : public CDialogEx
- {
- public:
- CMyDialog(CWnd* pParent = nullptr);
- virtual BOOL OnInitDialog();
- void StartThread();
- static UINT ThreadFunction(LPVOID pParam);
- private:
- int m_ThreadResult; // 存储线程返回值
- };
- // 线程函数
- UINT CMyDialog::ThreadFunction(LPVOID pParam)
- {
- // 执行一些操作
- int result = 42; // 示例结果
- CMyDialog* pDlg = (CMyDialog*)pParam;
- pDlg->m_ThreadResult = result; // 设置返回值
- return 0; // 返回值
- }
- // 启动线程
- void CMyDialog::StartThread()
- {
- AfxBeginThread(ThreadFunction, THREAD_PRIORITY_NORMAL, 0, 0, NULL, this);
- }
- // 在对话框初始化中
- BOOL CMyDialog::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- StartThread();
- // ... 其他初始化代码
- return TRUE;
- }
复制代码
### 方法二:使用 `PostMessage` 或 `SendMessage`
您可以通过发送消息的方式将结果传回主线程。这种方法可以使线程与主线程之间的通信更加灵活。
- #define WM_THREAD_RESULT (WM_USER + 1) // 自定义消息
- class CMyDialog : public CDialogEx
- {
- public:
- CMyDialog(CWnd* pParent = nullptr);
- virtual BOOL OnInitDialog();
- void StartThread();
- static UINT ThreadFunction(LPVOID pParam);
- afx_msg void OnThreadResult(WPARAM wParam, LPARAM lParam);
- DECLARE_MESSAGE_MAP()
- };
- // 消息映射
- BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
- ON_MESSAGE(WM_THREAD_RESULT, &CMyDialog::OnThreadResult)
- END_MESSAGE_MAP()
- // 线程函数
- UINT CMyDialog::ThreadFunction(LPVOID pParam)
- {
- // 执行一些操作
- int result = 42; // 示例结果
- // 发送消息到主线程
- ::PostMessage(((CMyDialog*)pParam)->m_hWnd, WM_THREAD_RESULT, result, 0);
- return 0; // 返回值
- }
- // 处理线程结果
- afx_msg void CMyDialog::OnThreadResult(WPARAM wParam, LPARAM lParam)
- {
- int result = (int)wParam; // 获取结果
- // 处理结果
- }
- // 启动线程
- void CMyDialog::StartThread()
- {
- AfxBeginThread(ThreadFunction, THREAD_PRIORITY_NORMAL, 0, 0, this);
- }
- // 在对话框初始化中
- BOOL CMyDialog::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- StartThread();
- // ... 其他初始化代码
- return TRUE;
- }
复制代码
### 方法三:使用同步对象(如事件)
您可以使用事件对象来同步线程之间的操作。主线程可以等待事件的触发,然后获取结果。
- class CMyDialog : public CDialogEx
- {
- public:
- CMyDialog(CWnd* pParent = nullptr);
- virtual BOOL OnInitDialog();
- void StartThread();
- static UINT ThreadFunction(LPVOID pParam);
- private:
- CEvent m_Event; // 事件对象
- int m_ThreadResult; // 存储线程返回值
- };
- // 线程函数
- UINT CMyDialog::ThreadFunction(LPVOID pParam)
- {
- // 执行一些操作
- int result = 42; // 示例结果
- CMyDialog* pDlg = (CMyDialog*)pParam;
- pDlg->m_ThreadResult = result; // 设置返回值
- pDlg->m_Event.SetEvent(); // 触发事件
- return 0; // 返回值
- }
- // 启动线程
- void CMyDialog::StartThread()
- {
- AfxBeginThread(ThreadFunction, THREAD_PRIORITY_NORMAL, 0, 0, this);
- }
- // 在对话框初始化中
- BOOL CMyDialog::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- StartThread();
- // 等待线程完成
- WaitForSingleObject(m_Event.m_hObject, INFINITE);
- // 现在可以使用 m_ThreadResult
- return TRUE;
- }
复制代码
### 总结
以上是几种常见的方法来获取线程的异步返回值。根据具体需求选择合适的方法,确保线程安全和数据一致性。
|
|