C++ WTL8.1 如何在消息循环的新线程中创建窗口?

标签 c++ windows multithreading wtl

我看到这个问了很多方法,但从未见过实际工作的代码片段。

我尝试过这个毫无疑问的幼稚尝试,即创建一个带有新窗口和消息循环的新线程。我有一个函数,它必须打开一个窗口并处理它的消息,并且必须在可以从没有现有消息循环(也没有其他窗口)或通常的 mfc 消息循环或 WTL 消息循环的应用程序调用它的环境中运行。我看到了一些关于 AddMessageLoop 和模块的东西?但它似乎是针对主要应用程序的。无论如何,那里可能有也可能没有 WTL 模块。需要一个带有基本消息循环的独立窗口。传入一个窗口尚未打开的 WTL 类,因此窗口在与循环相同的线程中打开。是否也必须在新线程中创建类对象?

// does not work.... 
static DWORD WINAPI MyRunThread(__in LPVOID lpParameter)
{
CMessageLoop theLoop;
WTLsubclass *nav = (WTLsubclass *) lpParameter;

nav->CreateWindow(); 
int nRet = theLoop.Run();

return nRet;
}

CreateThread(0,0,MyRunThread,&nav,0,0);

最佳答案

请参阅评论以了解所需的更改。 Gotcha #1 was & 运算符不适用于 WTL 类 Gotcha #2,永远不会命名你的事件。如果您链接到未知的其他对象, 很可能有人已经使用了相同的名称,并且 Windows 决定相同的名称表示相同的事件,即使使用了多个 CreateEvent() 调用也是如此。无名, 没有所谓的不同事件的“混叠”。

Non-Gotcha,如果您不希望“主要”消息处理程序处理您的消息,则不需要 _Module 或“告诉”有关您的消息循环的任何信息。如果你想独立 具有独立循环的窗口,请参见下文。

============================================= ====

static DWORD WINAPI MyRunThread(__in LPVOID lpParameter)
{
CMessageLoop theLoop;
WTLsubclass *nav = (WTLsubclass *) lpParameter;

nav->CreateWindow(); 
SetEvent(WindowCreatedEvent) // signal event HANDLE type for worker thread

int nRet = theLoop.Run();

return nRet;
}

//CreateThread(0,0,MyRunThread,&nav,0,0); // & wont work on WTL class objects
// some genius overloaded the & operator on WTL class objects, just because in C++ you can

//Workaround to get address of WTL class object
CLASSnav nav[1];
CLASSnav *pnav = nav; // because arrays is address of first element.
CreateThread(0,0,MyRunThread,pnav,0,0);

关于C++ WTL8.1 如何在消息循环的新线程中创建窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10255380/

相关文章:

c++ - 在 Windows 上发送 Ctrl+C 到 QProcess

C# <-> C++ : Marshaling an [In, Out] 包含 Char[] 的结构

c++ - 开始使用 C++ 编程的教育 IDE?

windows - Windows 8.1+ IE 11 中的 Web 套接字客户端连接问题 + 不允许环回

windows - 为什么我的自定义消息在应用程序启动时被发送?

JavaFx8 属性绑定(bind)导致 "No Fx8 Application thread"

c++ - Newton Raphson 中的波动值

c# - 获取应用程序ID

objective-c - 在 objective-c 中在主线程上执行选择器的最佳方法?

java - 需要帮助理解有关并行流性能提升的文章