原文问题
我们的应用程序使用CSocket,它需要消息泵运行才能工作。 目前,切换到另一个套接字实现是不切实际的,尽pipe这是我们最终想要达成的目标。
该应用程序是在Visual C ++(不受pipe理)。
我们目前通过使用C#.NET服务启动程序来启动C ++ DLL,该启动程序通过Application.Run启动消息泵,然后使用DllImport在我们的DLL中启动启动方法。
这有很多问题,其中最紧迫的是,如果DLL因任何原因崩溃,我们不会得到一个转储文件!
由于这个原因,我们正在切换到一个C ++服务启动器,虽然我们对它的服务方面没有问题,但是我们却对如何让消息泵继续运行感到困惑。
我看了一下谷歌和这里的一些问题,但我的问题的一部分是缺乏基本的C + +知识,所以如果这是一个愚蠢的问题,如果有人能指出我在正确的方向,将不胜感激道歉。
非常感谢马特·佩德勒斯登
更多信息
目前我们试图replace的C#服务本质上是这样的:
public void PumpThread() { DLLStart(); Application.Run(); } protected override void OnStart(string[] args) { try { Thread pumpThread = new Thread(new ThreadStart(PumpThread)); pumpThread.IsBackground = true; pumpThread.Start(); } catch (DllNotFoundException dnfe) { } catch (Exception e) { } } protected override void OnStop() { try { DLLStop(); } catch (DllNotFoundException dnfe) { } catch (Exception e) { } }
实质上,我们只是试图用C ++replace上述C#.NET Windows服务,以便我们的代码完全在非托pipe的世界中运行,而不是不必要地混淆了5行托pipe代码。
DLLStart()和DLLStop()是从我们的C + Unmanaged DLL中导入的两个实际启动和停止系统的函数。
我不完全确定这是一个什么样的Visual C ++项目,为了能够对泵做任何事情,要么是诚实的。
希望这个额外的数据是有用的。
我翻译的C ++代码如下(未检查:)
PS:在同一个线程中调用DLLStart,DLLStop会更可靠。
全局变量包含threadID
DWORD threadID = 0;
在OnStart中相当于:
CreateThread(0, 0, PumpThread, 0, 0, 0);
在OnStop中相当于:
PostThreadMessage(threadID, WM_QUIT, 0, 0);
线程程序:
DWORD WINAPI PumpThread(void* param) { threadID = GetCurrentThreadId(); DLLStart(); // create thread message queue PeekMessage(&msg, 0, WM_USER, WM_USER, PM_NOREMOVE); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } DLLStop(); }
最简单的消息循环如下所示:
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
但是我不确定是否真的能够回答你的问题 – 你不能只在你喜欢的任何地方运行一个消息循环。 所以我们需要更多的细节。
你将不得不创建一个用户界面线程。 工作线程没有消息泵
看看CWinThread