Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: cdsmika от Октябрь 15, 2014, 02:10



Название: Синглтон приложение для сервисного и консольного исполнения
Отправлено: cdsmika от Октябрь 15, 2014, 02:10
Задача сделать глобальный признак того, что приложение уже запущено.
У меня два исполнения одной и той же реализации: одна в виде QtService, другая в виде консоли.
Подсмотрел следующий код:
Код:
bool Worker::isJobAlreadyRunning()
{
    QSystemSemaphore sema("1", 1);
    sema.acquire();

    bool isRunning = false;
    _shmem.setKey("2");

    if (_shmem.attach())
        isRunning = true;
    else
        _shmem.create(1);

    sema.release();

    return isRunning;
}
void Worker::start()
{
    if ( isJobAlreadyRunning() )
    {
        qCritical() << trUtf8("Job is already running in other application. Cannot run a duplicate job!");
        return;
    }
...
}
для нескольких консольных исполнений работает нормально,
а вот сервис разделяемый кусок памяти не видит и продолжает работать при запущенной консоли. И наоборот - консоль не ведает о занятом куске памяти сервиса


Название: Re: Синглтон приложение для сервисного и консольного исполнения
Отправлено: cdsmika от Октябрь 15, 2014, 11:04
Старт сервиса:
Код:
int main(int argc, char **argv)
{
    QCoreApplication::setApplicationVersion("2.5.4");

    Service service(argc, argv);
    return service.exec();
}
...
void Service::start()
{
    logMessage(QObject::trUtf8("Starting service..."), QtServiceBase::Information );

    const QStringList arguments = QCoreApplication::arguments();
    QString fileName = (arguments.size() > 1) ?
            arguments.at(1) : QCoreApplication::applicationDirPath()+"/conf/service_conf.xml";

    m_worker = new Worker( fileName );
    m_worker->start();
}
соответственно тут QtSingleApplication не подойдет.

Старт консоли:
Код:
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QString fileName = (argc > 1) ?
            argv[1] : QCoreApplication::applicationDirPath()+"/conf/service_conf.xml";

    qRegisterMetaType<QtMsgType>("QtMsgType");
    qInstallMsgHandler(messageOutput);

    Worker worker( fileName );
    worker.start();
    return a.exec();
}


Название: Re: Синглтон приложение для сервисного и консольного исполнения
Отправлено: cdsmika от Октябрь 15, 2014, 11:08
Попробую QLocalSocket
http://developer.nokia.com/community/wiki/Run_only_one_instance_of_a_Qt_application


Название: Re: Синглтон приложение для сервисного и консольного исполнения
Отправлено: cdsmika от Октябрь 15, 2014, 14:51
Попробую QLocalSocket
http://developer.nokia.com/community/wiki/Run_only_one_instance_of_a_Qt_application
Да, так работает и в сервисе:
Код:
bool Job::isJobAlreadyRunning()
{
    QLocalSocket socket;
    socket.connectToServer(objectName());
    if (socket.waitForConnected(500))
        return true; // Exit already a process running

    _localServer.listen(objectName());
    return false;
}