Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows信号量和QSystemeMaphore_C++_Qt_Winapi_Visual C++_Semaphore - Fatal编程技术网

C++ Windows信号量和QSystemeMaphore

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";

我在Windows中两个应用程序之间的信号量有问题。一个应用程序等待释放信号(Qt),另一个应用程序发送释放信号(MSVC2008)。但它不起作用

我测试了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;
}
//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端也有同样的问题,我无法解决。我必须更改信号量的名称。