从Visual C ++ 2010中的单独线程调用MessageBox

时间:2017-03-24 14:50:16

标签: c++ multithreading visual-studio-2010 mfc

我正在使用MFC创建基于表单的Visual C ++(我相信的CLI)应用程序。

当用户点击一个按钮时,我使用AfxBeginThread函数启动一个单独的线程。

我在该线程中有一个try / catch块,如果抛出异常,我想用MessageBox提示用户。

当我在MFC成员函数中编写MessageBox时,没有语法错误,但是当我在AfxBeginThread调用的函数中编写MessageBox时,它不喜欢字符串前面的大写字母L,它不会识别MB_ICONEXCLAMATION定义。

例如:

//This compiles just fine
void CMyDialogDlg::OnBnClickedButton1()
{
    AfxBeginThread(populateFilesThread,this);
    MessageBox(L"Cool, everything is okay", L"Title", MB_ICONEXCLAMATION);

}
//This won't compile, and I am afraid it wouldn't work anyway because it isn't from the main thread
void populateFilesThread()
{
     MessageBox(L"Does not compile", L"Would it even work?", MB_ICONEXCLAMATION);
}

编译错误是“错误:类型的参数”const wchar_t *“与”HWND“类型的参数不兼容

错误:类型为“long”的参数与“LPCWSTR”类型的参数不兼容

1 个答案:

答案 0 :(得分:0)

populateFilesThread 不是类的一部分,因此无法访问局部变量。因此,它不能使用隐式使用 MessageBoxm_hwnd 重载 CWnd::MessageBox(LPCTSTR, LPCTSTR, int),您必须使用 ::MessageBox(HWND, LPCTSTR, LPCTSTR, int) 这也解释了您收到的错误消息。

您可以安全地将 nullptr 作为 HWND 传递。