【问题标题】:Windows Semaphore and QSystemSemaphoreWindows 信号量和 QSystemSemaphore
【发布时间】:2012-03-08 12:58:31
【问题描述】:

Windows 中两个应用程序之间的信号量存在问题。一个应用程序等待释放信号(Qt),另一个应用程序发送释放信号(MSVC2008)。但它不起作用。

我测试了 Qt-Qt 和 MSVC2008-MSVC2008 模式,它们都成功了。但是当我尝试 Qt-MSVC2008 模式时它失败了。

// MSVC2008:
#include <windows.h>
#include <stdio.h>
int main()
{
    const WCHAR semName[] = L"TestSem";

    PHANDLE sem = (HANDLE *) CreateSemaphore (NULL, 0, 1, semName);

    if (sem == NULL)
    {
         sem = (HANDLE *)OpenSemaphore (SEMAPHORE_ALL_ACCESS, 0, semName);
    }

    if (sem == NULL)
    {
        printf("OPEN/CREATE ERROR\n");
        return 0;
    }

    BOOL r = ReleaseSemaphore(sem, 1 ,NULL);
    if (r)
        printf("OK\n");
    else
        printf("RELEASE ERROR\n");
    CloseHandle (sem);

    return 0;
}

// Qt 4.8.0 :
#include <QSystemSemaphore>
#include <QCoreApplication>
#include <iostream>

int main()
{
    QSystemSemaphore *sem_read = new QSystemSemaphore("TestSem");

    std::cout << "Wait for signal: " << std::endl;

    while (1)
    {
        sem_read->acquire();
        std::cout << "Hi" << std::endl;
    }

    return 0;
}

我希望当 Qt-app 运行时,在执行 MSVC2008-app 后,它会在屏幕上打印一个“Hi”。但它没有。有什么问题?!

注意:我正在为 Qt 使用 Windows 7 和 MinGW 编译器

【问题讨论】:

  • 你确认你使用MSVC2008来编译你的Qt App吗?

标签: c++ qt winapi visual-c++ semaphore


【解决方案1】:

查看 Qt 源代码 (4.7.3) 我在 corelib/kernel/qsystemsemaphore_p.h:79 看到 Qt 生成的信号量名称以 qipc_systemsem_ 为前缀。

[UPDATE] "TestSem" 的 sha1 哈希也被附加了,所以得到的 Qt 信号量名称是qipc_systemsem_TestSem3ec37c26f212774998f34a4e6722cac152ad17fa

确认工作。

生成信号量名称:

QString prefix = "qipc_systemsem_";
QString key = "TestSem";

QString result = prefix;

QString part1 = key;
part1.replace(QRegExp(QLatin1String("[^A-Za-z]")), QString());
result.append(part1);

QByteArray hex = QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Sha1).toHex();
result.append(QLatin1String(hex));

qDebug() << result;

【讨论】:

  • 嗯,我在使用 QSharedMemory 时遇到了同样的问题,尽管它在 Qt 4.8.0 中使用 setNativeKey 解决了。似乎 QSystemSemaphore 有同样的问题,我无法在 Qt 端解决它。我必须更改信号量的名称。
【解决方案2】:

我会研究两件事:

  1. QSystemSemaphore 需要一个初始值,如果没有给出,则以 0 开始。也许从 1 开始?

  2. 这是一个系统信号量,会不会是你的第一次测试没有释放它?试试改名字吧。

【讨论】:

  • 1.它导致 qt-app 显示一个“Hi”并再次停止。 2.没有效果
  • @Masoud,它应该只打印一次,因为 Windows 应用程序将信号量最大计数设置为 1,并且您的 qt 应用程序在 Windows 应用程序发布它后设法获取它,试图获取另一个原因它要阻止吗?
猜你喜欢
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2020-02-16
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多