单独线程上的 CoInitialize() 崩溃而不返回
CoInitialize() on a separate thread crash without returning
我按照 direct2d quickstart 进行操作,一切正常。但是当我将函数从 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);
}
在上面的代码中,如果我在wWinMain
中直接调用StartAnimation
,就可以了。但是将它移到线程中,它崩溃了。
当我调试时,它永远不会到达 CoInitialize(NULL) 下面的代码,将断点设置到它,而在它上面,点击 step over 或 step in 或 continue,调试终止。它从不打印任何东西。如果我不使用线程,它会打印 0.
您看到的 "crash" 与 CoInitialize
无关。问题是 wWinMain
函数在调用 CreateThread
之后继续执行。下一条语句是 return 0;
,程序流从 wWinMain
开始 return。至此进程终止,一切结束。大概你想要某种循环,在你从 wWinMain
return 之前连续处理某些东西(输入,逻辑,等等),而不是仅仅结束程序。
我按照 direct2d quickstart 进行操作,一切正常。但是当我将函数从 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);
}
在上面的代码中,如果我在wWinMain
中直接调用StartAnimation
,就可以了。但是将它移到线程中,它崩溃了。
当我调试时,它永远不会到达 CoInitialize(NULL) 下面的代码,将断点设置到它,而在它上面,点击 step over 或 step in 或 continue,调试终止。它从不打印任何东西。如果我不使用线程,它会打印 0.
您看到的 "crash" 与 CoInitialize
无关。问题是 wWinMain
函数在调用 CreateThread
之后继续执行。下一条语句是 return 0;
,程序流从 wWinMain
开始 return。至此进程终止,一切结束。大概你想要某种循环,在你从 wWinMain
return 之前连续处理某些东西(输入,逻辑,等等),而不是仅仅结束程序。