Windows信号量和QSystemSemaphore
Windows Semaphore and QSystemSemaphore
我在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;
我要研究的两件事:
-
QSystemSemaphore
需要一个初始值,如果没有给定,则用0初始化。也许从1开始? -
这是一个系统信号量,可能是您的第一次测试没有发布它吗?也许试着改一下名字。
相关文章:
- 没有找到相关文章