Russian Qt Forum
Ноябрь 22, 2024, 22:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Синглтон приложение для сервисного и консольного исполнения  (Прочитано 3676 раз)
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;
    }
...
}
для нескольких консольных исполнений работает нормально,
а вот сервис разделяемый кусок памяти не видит и продолжает работать при запущенной консоли. И наоборот - консоль не ведает о занятом куске памяти сервиса
« Последнее редактирование: Октябрь 15, 2014, 02:15 от cdsmika » Записан
cdsmika
Гость
« Ответ #1 : Октябрь 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();
}
Записан
cdsmika
Гость
« Ответ #2 : Октябрь 15, 2014, 11:08 »

Попробую QLocalSocket
http://developer.nokia.com/community/wiki/Run_only_one_instance_of_a_Qt_application
Записан
cdsmika
Гость
« Ответ #3 : Октябрь 15, 2014, 14:51 »

Да, так работает и в сервисе:
Код:
bool Job::isJobAlreadyRunning()
{
    QLocalSocket socket;
    socket.connectToServer(objectName());
    if (socket.waitForConnected(500))
        return true; // Exit already a process running

    _localServer.listen(objectName());
    return false;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.345 секунд. Запросов: 21.