У меня есть класс 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
, но этоне нравится, что третий аргумент является функцией-членом.Я пытался сделать это статической функцией-членом, но, похоже, это тоже не нравится.Он говорит, что DWORD (__stdcall *) () несовместим с LPTHREAD_START_ROUTINE.