2012-03-08 67 views
2

我有兩個應用程序之間的Windows信號量問題。應用程序等待釋放信號(Qt),另一個應用程序發送釋放信號(MSVC2008)。但它不起作用。Windows Semaphore和QSystemSemaphore

我測試了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的應用程序正在運行,執行MSVC2008-應用程序後,我想到,它在屏幕打印一個 「嗨」。但它不會。問題是什麼?!

注:我使用的是Windows 7和MinGW編譯Qt的

+0

你確認你使用MSVC2008編譯你的Qt應用程序? – Koying 2012-03-08 13:13:49

+0

不,我爲Qt使用MinGW – deepmax 2012-03-08 13:15:33

回答

3

望着的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; 
+0

答案更新爲SHA1哈希加入Qt – Koying 2012-03-08 16:44:02

+0

恩,我和QSharedMemory有同樣的問題,雖然它在Qt 4.8.0中用setNativeKey解決了。看來QSystemSemaphore有同樣的問題,我無法在Qt方面解決它。我必須改變信號量的名字。 – deepmax 2012-03-08 19:04:16

0

2的事情,我會考慮:

  1. QSystemSemaphore需要一個初始值,並開始0,如果是沒有給。也許從1開始吧?

  2. 這是一個系統信號量,難道你的第一個測試沒有發佈嗎?試着改變名字也許。

+0

1.它導致qt-app顯示一個「Hi」並再次停止。 2.沒有效果 – deepmax 2012-03-08 13:14:59

+0

@Masoud,它應該只打印一次,因爲Windows應用程序的信號量最大計數設置爲1,並且您的qt應用程序在Windows應用程序發佈它之後設法獲取它,試圖再獲取一個會導致它阻止? – Kristofer 2012-03-08 13:27:22

+0

當然,你應該在之後發佈它。 – 2012-03-08 13:53:57

相關問題