Семафор Windows и QSystemSemaphore - PullRequest
2 голосов
/ 08 марта 2012

У меня проблема с семафорами в 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-приложение запущено, после выполнения приложения MSVC2008 оно печатает один "Привет"на экране.Но это не доза.В чем проблема?!

Примечание: я использую Windows 7 и MinGW компилятор для Qt

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

Глядя на источники Qt (4.7.3), я вижу на corelib/kernel/qsystemsemaphore_p.h:79, что имя семафора, сгенерированное Qt, имеет префикс qipc_systemsem_.

[ОБНОВЛЕНИЕ] Хэш sha1 «TestSem» также добавляется, поэтому результирующее имя семафора 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 голосов
/ 08 марта 2012

2 вещи, которые я бы изучил:

  1. QSystemSemaphore требует начальных значений и инициируется 0, если оно не задано.Может быть, начать с 1?

  2. это системный семафор, может быть, ваш первый тест не выпустил его?попробуй сменить имя возможно.

...