Winapi同步进程

Winapi synchronizing processes

本文关键字:进程 同步 Winapi      更新时间:2023-10-16

我有3个简单的程序,每个都是一个简单的窗口。我将启动所有3个过程,然后点击程序1或2的按钮,显示程序3的窗口。
节目1 &2:只有一个按钮。点击后,显示程序3的隐藏进程(也是一个窗口)。
程序3:作为隐藏进程启动,在弹出之前等待程序1和程序2的消息。根据按下的按钮,窗口标题应该变为程序1或程序2的标题。

我不确定什么功能或我使用线程使这种行为?我相信我需要使用某种线程来做到这一点。首先将程序3隐藏,然后等待程序1和程序2的消息。什么好主意吗?

编辑:我正在使用c++,我被告知使用一个信号量。

我建议使用Windows Event。具体来说,是手动复位事件。您的程序3对事件执行Wait操作。当程序1或程序2想要唤醒窗口时,它设置事件。当程序3返回隐藏时,它清除事件。

您可以使用SendMessagePostMessage,但事件似乎更容易和直接。它也有一些优点:

  • 程序1和程序2不需要找到程序3的窗口句柄,或者广播可能被其他进程截获的消息。
  • 您可以为事件添加安全属性,以防止恶意程序访问它。你可以在控制台应用程序、Windows服务或任何其他进程中使用该技术,而不管它是否在操作消息循环。
  • 这比使用Windows消息更容易理解(至少对我来说)。

这不是信号量的适当用法。信号量通常用于同步对多个共享资源的访问。你想要的只是程序3等待通知,而程序1或程序2能够发送通知。

如果你必须将数据从程序1传递给程序3,那么Event将无法帮助你做到这一点。你必须想出一种通信方法,比如内存映射文件、管道、网络套接字……在这种情况下甚至是一条Windows消息。但是对于简单的"嘿,醒醒!"通知,我会使用事件。

因为您需要跨流程边界通信一个简单的消息,所以我建议使用SendMessage家族中的一些东西。首先需要获取目标窗口的句柄。这个函数在窗口API中是相当低级的,所以你只能直接从C/c++中获得它,但你没有指定你使用的是什么语言,我认为在这个例程周围有包装器,可以通过c#访问CLR。