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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ininite-loop при использовании метода install из класса QtServiceController  (Прочитано 4024 раз)
neyroman
Гость
« : Октябрь 30, 2017, 10:47 »

Всем привет, пишу кросплатформенную программу, которая должна работать как демон на Linux и как сервис на Windows.
Есть несколько варинатов событий, реализованных через флаги. Все обрабатываются нормально за исключением флагов ответственных за установку сервиса/демона.
 Ситуация такая, что при этом программа доходит до метода install ( из класса QtServiceController ) и при первой итерации этот метод не вызывается, при второй итерации он вызывается ( после обработки метода инсталл должен вызываться метод start из того же класса ), доходит до метода start ( из класса QtServiceController ) и его уже не обрабатывает, по крайней мере корректно, а уходит в бесконечный цикл. Выглядит так будто она вызывает себя повторно, и проходит все этапы обработки флага install, начиная с main. Часть кода, о которой я говорю выглядит следующим образом:
 
Код:
if ( !( ptrCtl->isInstalled() ) ) {
                qDebug() << ptrCtl->serviceName() << " was not installed ==================== >>>";
                qDebug() << ptrCtl->serviceName()
                         << ( ( ptrCtl->install( getProgName() ) )
                              ? " was successfully" : " was not " ) <<  "installed";

                qDebug() << "before " << ptrCtl->serviceName() << "start";
                qDebug() << getProgName()
                         << ( ( ptrCtl->start() )
                              ? " was" : " was not " ) <<  "started";
Строка:
Цитировать
qDebug() << ptrCtl->serviceName() << " was not installed ==================== >>>";
добавлена чтобы сделать вывод программы более читаемым.
 
Вывод выглядит так
"d_server"  was not installed ==================== >>>
"d_server"  was successfully installed
"d_server"  was not installed ==================== >>>
....
"d_server"  was not installed ==================== >>>

При этом аргумент argc в main( int argc, char **argv ) при первой итерации равен 2, при последующих - 4.

Мой вопрос: как сделать так, чтобы запускался метод start ( класс QtServiceController ) и программа не уходила в бесконечный цикл.

Заранее спасибло за помощь. Весь код не выкладывал, что бы не занимал много места, естественно при необходимости могу выложить.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Октябрь 30, 2017, 13:04 »

QtServiceController это не "штатный" класс qt - кто его работу проверял, не ясно
QtServiceController::install тупо вызывает QProcess::execute - смотри что он там делает
Ну и кросплатформенно тут не получится вообще
Записан
neyroman
Гость
« Ответ #2 : Октябрь 30, 2017, 13:16 »

Привет, спасибо за ответ.  Улыбающийся
QtServiceController::install тупо вызывает QProcess::execute - смотри что он там делает
Ну и кросплатформенно тут не получится вообще
а почему не получится? я имею ввиду, я понял что он вызывает QProcess и значит только под Unix, но QtSolutions и в частности qtServices позиционируется как средство кросс-платформенной разработки. В замешательстве
Если с этой либой никак, то может есть какие другие варианты разработки под Wndows/Unix ( без использования макросов я имею ввиду ) с Qt либами?

Заранее спасибо
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Октябрь 30, 2017, 13:39 »

если QtServiceController::install тупо вызывает QProcess::execute, то очевидно дальше ты сам определяешь что вызывать в каком случаи, никакой кросплатформенной помощи тут нет
тоже самое с isInstalled - для linux там вообще "заглушка", ибо для каждого linux дистрибутива своя система старта, хотя обычно можно полагаться на ubuntu
а что они там про себя позиционируют, так это их дело, по факту - нет

итого - для windows изучать winapi, для linux писать скрипт (это вообще большой отдельный вопрос) и его вызывать, нет тут никакой кросплатформенной помощи

ну и хорошее место для темы "Вопросы новичков" )
тут надо обе ОС знать хорошо и их вариации
Записан
neyroman
Гость
« Ответ #4 : Октябрь 30, 2017, 13:57 »

qate, спасибо за ответ. Значит придется помучаться  Обеспокоенный, а то я надеялся на легкий исход  Веселый
Записан
neyroman
Гость
« Ответ #5 : Октябрь 30, 2017, 13:58 »

а какой смысл тогда в QtService если уже есть стандартный QProcess?
Записан
neyroman
Гость
« Ответ #6 : Октябрь 30, 2017, 14:00 »

ну и хорошее место для темы "Вопросы новичков" )
тут надо обе ОС знать хорошо и их вариации
я просто подумал, что мой вопрос будет каксаться исклюительно использования qt-solutuions, надеялся что затык только в ее незнании.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #7 : Октябрь 30, 2017, 15:56 »

а какой смысл тогда в QtService если уже есть стандартный QProcess?

наверно они не смогли, когда поняли что не все так просто
Записан
neyroman
Гость
« Ответ #8 : Октябрь 31, 2017, 08:58 »

Спасибо за ответ, но честно говоря слабо верится что это так.  В замешательстве Надо мне будет тоже получше разобраться с этой либой.  Подмигивающий
В любом случае спасибо за помощь  Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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