我有一系列Win64控制台应用程序,一个是“主人”,另外16个是“奴隶”。
此逻辑的原始版本只有一个可执行文件,当使用命令行参数“init”启动时,它将初始化一个非常大的数据集(3gigs),然后坐在Windows消息泵上等待请求分析的消息大数据集。当需要分析数据集时,启动相同的可执行文件并使用分析请求参数,新启动的可执行文件将找到已初始化的自身实例的窗口句柄,并通过以下方式将分析请求和参数发送到已初始化的实例Windows消息WM_COPYDATA。这就像是一个可执行架构的魅力。
然而,现在我有一个更强大的系统,我想一次运行多个分析可执行文件,每个可执行文件在不同的核心上。所以我创建了一个新的体系结构,其中有16个分析可执行文件,作为管理器控制台应用程序的“从属”,充当“主”。 (仅供参考,一个分析请求可能需要0.5到4.0秒 - 因此我希望立即运行倍数。)
仍然使用Windows消息作为我的通信方式,使用SendMessage()会阻止调用方,直到接收方处理消息。这不好,因为我希望同时处理这些消息。因此,我尝试使用异步Windows消息函数,例如SendMessageCallback()和SendNotifyMessage()。它们要么以阻止方式失败,要么以阻止方式执行,而不是同时执
更多研究使我将“命名共享内存”作为在我的可执行文件(本质上是内存映射文件)之间进行通信的一种方式。所以我设置了它,我的主人现在能够创建命名共享内存块,并且我的所有可执行文件都能够请求相同内存的视图,并通过状态机处理命名共享内存中的数据,在主设备和从设备之间保持同步。
但是,我发现主设备和从设备似乎没有连续运行。
我仍在使用master的基本思想是通过命令行保存分析参数启动的,该可执行文件通过命名共享内存设置和所有从站的当前状态向已经运行的自身版本发送消息,然后选择一个可用的从站,它的命名共享内存驻留状态机获取分析请求。
这部分工作正常。但是,从属服务器似乎处于睡眠或其他休眠状态,因为我修改的Windows消息循环似乎没有循环。
以下是我当前的Windows消息处理循环:
while (1) {
int status = ::GetMessage(&msg, 0, 0, 0);
if (status != 0) {
if (status == -1) return -1
::DispatchMessage(&msg);
}
else if (status == 0)
break;
HandleSharedMemoryDeliveredTasks(); // NOTE: checking Named Shared Memory
}
除非收到Windows消息,否则不会触发在此循环中放置断点。
所以,我想知道如何保持循环活动,以便继续检查命名共享内存,而不必发送(阻塞)消息。
我知道我在一个问题空间中运行,我应该将主和从属可执行文件转换为Windows服务。但是,我非常非常接近使用它(似乎),重写Windows服务是我没有经验的领域。
另外,我在我的可执行文件中使用它来保持活动状态(但它似乎没有帮助):
// during program init:
SetThreadExecutationState(ES_CONTINIOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED);
当主设备设置状态机工作时,我是如何异步“唤醒”一个从设备的建议,同样让工作完成后从设备“唤醒”主设备?