【发布时间】:2011-11-10 09:49:02
【问题描述】:
我有一个名为 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,但不喜欢第三个参数是成员函数。我尝试将其设为 static 成员函数,但它似乎也不喜欢那样。这是说 DWORD (__stdcall *)() 与 LPTHREAD_START_ROUTINE 不兼容。
【问题讨论】: