gpt4 book ai didi

c++ - Windows 信号量和 QSystemSemaphore

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:52 25 4
gpt4 key购买 nike

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 编译器

最佳答案

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

[更新]“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;

关于c++ - Windows 信号量和 QSystemSemaphore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com