我遵循了Direct2D快速入门,并且一切正常。但是当我将功能从wWinMain移到threadproc并在另一个线程中启动它时,它崩溃了。
#include "GUI/gui.h"
#include "GUI/BaseWnd.h"
#include <iostream>
#include <string>
#include <sstream>
DWORD WINAPI StartAnimation(LPVOID lpThreadParam)
{
//HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
try
{
HRESULT hr = CoInitialize(NULL);
printf("%d",hr);
//if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
if (SUCCEEDED(hr))
{
{
BaseWnd map;
//if (SUCCEEDED(map.Initialize(lpThreadParam)))
if (SUCCEEDED(map.Initialize()))
{
map.RunMessageLoop();
}
}
return 0;
}
}
catch (const std::exception& e)
{
printf("{0}", e);
}
auto e = GetLastError();
return -1;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
//initilize map
//initialize(graph)
//initialize window and base map according to model in anther THREAD
//run solution provide
DWORD ThreadID;
int a = 3;
LPVOID lpThreadParam = &a;
HANDLE hThread = CreateThread(
NULL,
0,
StartAnimation,
lpThreadParam, //input data
0,
&ThreadID
);
//StartAnimation(lpThreadParam);
return 0;
}
int main() {
return _tWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
}
在上面的代码中,如果我直接在StartAnimation
中调用wWinMain
,它将起作用。但是将其移入线程会崩溃。
当我调试时,它永远不会到达CoInitialize(NULL)以下的代码,请为其设置断点,然后在其上按一下,进入或继续执行,调试将终止。它从不打印任何内容。如果我不使用线程,它将显示0。
答案 0 :(得分:1)
您看到的“崩溃”与CoInitialize
无关。问题在于,wWinMain
函数的执行在调用CreateThread
之后继续进行。下一条语句为return 0;
,程序流从wWinMain
返回。至此,过程终止,一切结束。大概您希望某种循环在从wWinMain
返回之前,而不是仅仅结束程序之前,能够连续处理某些事情(输入,逻辑等)。