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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtService и общая c консолью память  (Прочитано 5927 раз)
cdsmika
Гость
« : Октябрь 15, 2014, 02:13 »

Задача сделать глобальный признак того, что приложение уже запущено.
У меня два исполнения одной и той же реализации: одна в виде 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, 14:55 от cdsmika » Записан
vitfil
Гость
« Ответ #1 : Октябрь 15, 2014, 06:16 »

Поиском: singleton
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Октябрь 15, 2014, 10:21 »

Можно в реестр писать признак.  Я так делаю. У меня в проекте куча приложений (3 штуки, включая сервис). Так вот, из каждого надо знать состояние другого (запущено или нет). Так вот, я тупо пишу в реестр все Улыбающийся.
Записан

ArchLinux x86_64 / Win10 64 bit
cdsmika
Гость
« Ответ #3 : Октябрь 15, 2014, 10:49 »

Можно в реестр писать признак.  Я так делаю. У меня в проекте куча приложений (3 штуки, включая сервис). Так вот, из каждого надо знать состояние другого (запущено или нет). Так вот, я тупо пишу в реестр все Улыбающийся.
А кто будет чистить реестр, если приложение упадет? Это не очень-то надежный способ )
Записан
cdsmika
Гость
« Ответ #4 : Октябрь 15, 2014, 10:54 »

Поиском: singleton
Что-то не помогло решить проблему (
Записан
cdsmika
Гость
« Ответ #5 : Октябрь 15, 2014, 11:03 »

Старт сервиса:
Код:
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();
}
« Последнее редактирование: Октябрь 15, 2014, 11:05 от cdsmika » Записан
cdsmika
Гость
« Ответ #6 : Октябрь 15, 2014, 11:06 »

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

Да, так работает и в сервисе:
Код:
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.047 секунд. Запросов: 23.