Название: Синглтон приложение для сервисного и консольного исполнения
Отправлено: 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; }
|