我有一个名为GUIMain的类,它为我的程序注册,创建和显示一个主窗口。在它上面是一个按钮,当用户点击它时,它会显示一个额外的窗口。
如果我是用C#编写的,我会有两个选择:
AdditionalForm myForm = new AdditionalForm();
myForm.ShowDialog(this); // blocking. Returns when myForm is closed;
someOtherFunction();
或
AdditionalForm myForm = new AdditionalForm();
myForm.Show(this); // non-blocking.
someOtherFunction(); // runs while myForm is still visible
或者,即使这样也可以:
AdditionalForm myForm = new AdditionalForm();
new Thread(new ThreadStart(delegate()
{
myForm.ShowDialog(this); // blocks in a separate thread
})).Start();
someOtherFunction(); // runs while myForm is still visible
但我是用C ++编写的,而不是C#。
我还有一个名为PreviewWindow的类,其中包含公共成员函数Register()
,Create()
和Show()
。最后一个函数包含一个消息循环,它基本上使它成为阻塞调用 - 类似于C#的ShowDialog()
。
如何重新编写PreviewWindow::Show()
以使其没有阻塞循环:
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
或者,我怎样才能在一个单独的线程上调用它?
我现在有:
previewWindow = new PreviewWindow(hInstance, hWnd);
previewWindow->Register();
previewWindow->Create();
previewWindow->Show(); // blocks :(
previewWindow->DisplayImage(); // never runs.
我尝试了CreateThread
,但不喜欢第3个参数是成员函数。我试过把它变成一个静态成员函数,但它似乎也不喜欢它。它说DWORD(__stdcall *)()与LPTHREAD_START_ROUTINE不兼容。
答案 0 :(得分:2)
你应该只有一个事件循环,它将处理除模态窗口之外的所有窗口(它们运行自己的消息循环来阻止UI)。那么您的PreviewWindow::Show
只是ShowWindow(handle, SW_SHOW);
。通常应该在绝对必要时保存多线程。