Windows信号量和QSystemSemaphore

Windows Semaphore and QSystemSemaphore

本文关键字:QSystemSemaphore 信号量 Windows      更新时间:2023-10-16

我在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 ERRORn");
        return 0;
    }
    BOOL r = ReleaseSemaphore(sem, 1 ,NULL);
    if (r)
        printf("OKn");
    else
        printf("RELEASE ERRORn");
    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应用程序运行时,在执行MSVC2008应用程序后,它会在屏幕上打印一个"嗨"。但事实并非如此。怎么了?!

注意:我使用的是Windows 7和MinGW编译器用于Qt

查看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;

我要研究的两件事:

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

  2. 这是一个系统信号量,可能是您的第一次测试没有发布它吗?也许试着改一下名字。

相关文章:
  • 没有找到相关文章