C++ Windows信号量和QSystemeMaphore
我在Windows中两个应用程序之间的信号量有问题。一个应用程序等待释放信号(Qt),另一个应用程序发送释放信号(MSVC2008)。但它不起作用 我测试了Qt和MSVC2008-MSVC2008模式,它们成功了。但当我尝试Qt-MSVC2008模式时,它失败了C++ Windows信号量和QSystemeMaphore,c++,qt,winapi,visual-c++,semaphore,C++,Qt,Winapi,Visual C++,Semaphore,我在Windows中两个应用程序之间的信号量有问题。一个应用程序等待释放信号(Qt),另一个应用程序发送释放信号(MSVC2008)。但它不起作用 我测试了Qt和MSVC2008-MSVC2008模式,它们成功了。但当我尝试Qt-MSVC2008模式时,它失败了 // MSVC2008: #include <windows.h> #include <stdio.h> int main() { const WCHAR semName[] = L"TestSem";
// 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;
}
//MSVC2008:
#包括
#包括
int main()
{
const WCHAR semName[]=L“TestSem”;
PHANDLE sem=(HANDLE*)CreateSemaphore(NULL,0,1,semName);
if(sem==NULL)
{
sem=(HANDLE*)OpenSemaphore(SEMAPHORE\u ALL\u ACCESS,0,semName);
}
if(sem==NULL)
{
printf(“打开/创建错误”);
返回0;
}
BOOL r=释放信号量(sem,1,NULL);
if(r)
printf(“OK\n”);
其他的
printf(“发布错误\n”);
闭柄(sem);
返回0;
}
及
//Qt 4.8.0:
#包括
#包括
#包括
int main()
{
QSystemSemaphore*sem_read=新的QSystemSemaphore(“TestSem”);
std::cout2件事我会调查:
qsystemsmapore
需要一个初始值,如果没有给出,则以0开始。可能以1开始
这是一个系统信号量,可能是您的第一次测试没有释放它吗?请尝试更改名称
我会调查两件事:
qsystemsmapore
需要一个初始值,如果没有给出,则以0开始。可能以1开始
这是一个系统信号量,可能是您的第一次测试没有释放它吗?请尝试更改名称
查看Qt源代码(4.7.3),我在corelib/kernel/qsystemsemaphore\u p.h:79
中看到,Qt生成的信号量名称的前缀是qipc\u systemsem\u
[更新]还附加了“TestSem”的sha1散列,因此得到的Qt信号量名称是qipc_systemsem\u 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;
QString prefix=“qipc\u systemsem”;
QString key=“TestSem”;
QString结果=前缀;
QString part1=键;
第1部分:替换(QRegExp(QLatin1String(“[^A-Za-z]”),QString());
结果:追加(第1部分);
QByteArray hex=qcryptographicshash::hash(key.toUtf8(),qcryptographicshash::Sha1.toHex();
result.append(QLatin1String(hex));
qDebug()查看Qt源代码(4.7.3),我在corelib/kernel/qsystemsemaphore\u p.h:79
中看到,Qt生成的信号量名称的前缀是qipc\u systemsem\u
[更新]还附加了“TestSem”的sha1散列,因此得到的Qt信号量名称是qipc_systemsem\u 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;
QString prefix=“qipc\u systemsem”;
QString key=“TestSem”;
QString结果=前缀;
QString part1=键;
第1部分:替换(QRegExp(QLatin1String(“[^A-Za-z]”),QString());
结果:追加(第1部分);
QByteArray hex=qcryptographicshash::hash(key.toUtf8(),qcryptographicshash::Sha1.toHex();
result.append(QLatin1String(hex));
qDebug()您确认使用MSVC2008编译Qt应用程序吗?您确认使用MSVC2008编译Qt应用程序吗?1.这会导致Qt应用程序显示一个“Hi”然后又停了下来。2。不effect@Masoud,它应该只打印一次,因为windows应用程序将信号量最大计数设置为1,并且您的qt应用程序在windows应用程序发布后成功获取了它,尝试获取一个信号量会导致它阻止?1。它会导致qt应用程序显示一个“Hi”然后又停了下来。2。不effect@Masoud,它应该只打印一次,因为windows应用程序将信号量最大计数设置为1,并且您的qt应用程序在windows应用程序发布后成功获取了它,尝试获取一个信号量会导致它阻塞?嗯,我对QSharedMemory有同样的问题,尽管它在qt 4.8.0中用setNativeKey解决了。它是eems QSystemeMapore也有同样的问题,我无法在Qt端解决。我必须更改信号量的名称。嗯,虽然QSharedMemory在Qt 4.8.0中用setNativeKey解决了同样的问题,但我在Qt端也有同样的问题,我无法解决。我必须更改信号量的名称。