【问题标题】:QShared memory for an externally running process?Q共享内存用于外部运行的进程?
【发布时间】:2015-09-12 09:37:56
【问题描述】:

我有一个调用外部可执行文件的 QApplication。这个可执行文件将继续无限运行,通过标准输出将数据传递给这个 QApplication,除非用户从控制台运行它手动退出。此进程在运行时不会等待 stdin(它是一个简单的 c++ 代码,作为具有 while 循环的可执行文件运行)。

我希望能够通过将某种形式的信号从 QApplication 发送到外部进程来在运行时修改此可执行文件的行为。我阅读了有关 QT 的 IPC 的信息,我认为 QSharedMemory 是实现这一目标的最简单方法。我不能使用任何类型的管道等,因为该进程不等待标准输入。

是否可能存在由 QApplication 共享的 QSharedMemory 以及在外部运行的不是 QT 应用程序的进程。如果是的话,有没有人可以指出我的例子;我试图找到一些但找不到。如果不是,在我的特定情况下还有哪些其他选项可能有效?

提前致谢

【问题讨论】:

    标签: qt ipc qsharedmemory


    【解决方案1】:

    您必须等待任何类型的 I/O 的想法已经过时了。您应该设计您的代码,以便在完成 I/O 请求(新的输入数据可用,输出数据发送等)后,操作系统会立即通知它。

    您应该简单地使用标准输入来满足您的目的。该进程不必等待标准输入,它可以检查是否有任何输入可用,如果有则读取它。如果您轮询共享内存段的更改,您将在同一个地方执行此操作。

    对于 Unix 系统,您可以use QSocketNotifier 在标准输入可用时收到通知。

    在 Windows 上,最简单的测试是 _kbhit,其他解决方案请参阅 this answer。 QWinEventNotifier 也适用于 Windows 上的控制台句柄。

    【讨论】:

    • 所以我的 c++ 可执行文件(进程 2)标准输出已经在喷出我的 QApplication(进程 1)正在读取的数据。如果进程 1 想要向进程 1 的标准输入发送一些东西,进程 1 正在检查输入,我假设这 2 个流不会干扰? (我在某处读到,因为它们是单独的频道,所以没关系),但我会四处看看是否是这种情况。
    • @Anshul 他们为什么要干涉?那将使整个系统无用。每个方向都是独立的。这就是为什么,例如,在 Unix 上,标准输入和输出位于不同的文件描述符上。在 Windows 上也会发生一些功能相似的事情。
    • 谢谢,我会尝试你提到的标准输入方法。
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2014-05-08
    • 2017-05-10
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多