- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
我使用 QSharedMemory 和 QSystemSemaphore 来组织多个进程之间的事件交换。 QSharedMemory 存储接收者的数量和事件数据。接收者在 QSystemSemapho
Windows 中两个应用程序之间的信号量有问题。一个应用程序等待释放信号(Qt),另一个应用程序发送释放信号(MSVC2008)。但它不起作用。 我测试了 Qt-Qt 和 MSVC2008-MSVC
我是一名优秀的程序员,十分优秀!