LINUX.ORG.RU

Qt: выход из консольной проги


0

2

Вкратце так:

main.cpp

   int main(int argc, char *argv[]) {

      QCoreApplication a(argc, argv);
      a.exec();
      cout << "********* MAIN" << endl;
      return 0;
   }

A.cpp

   void term1_handler (int i) {
      QCoreApplication::exit(0);
   }

   A::aMethod() {
      ....
      if( error )
         QCoreApplication::exit(0);
   }

В общем надо выйти из проги либо по сигналу (term1_handler - обработчик сигнала SIGTERM), либо по ошибке из метода. По сигналу выходит нормально, из метода - никак. В чем причина ?


По сигналу выходит нормально, из метода - никак. В чем причина ?

очевидно в:

if( error )

//всегда Ваш, К.О.

shty ★★★★★
()

Мне кажется, что не успеваю выйти в event loop и QCoreApplication::exit(0) просто не срабатывает.

drZlo
() автор топика
Ответ на: комментарий от shty

aA - это объект (класса A) верхнего уровня в проекте, объявляется в main.

 int main(int argc, char *argv[]) {

      QCoreApplication a(argc, argv);

      A aA; // !!!!
      a.exec();
      cout << "********* MAIN" << endl;
      return 0;
 }

Сам метод aMethod() сейчас состоит из одной строчки QCoreApplication::exit(0), но, вызывается из конструктора, хм, может это влияет ?

drZlo
() автор топика
Ответ на: комментарий от drZlo

Сам метод aMethod() сейчас состоит из одной строчки QCoreApplication::exit(0), но, вызывается из конструктора, хм, может это влияет ?

ну event loop то Вы пускаете после того как конструктор отработал поэтому выход из него и «не срабатывает» :)

а что сделать-то хотите?

shty ★★★★★
()
Ответ на: комментарий от drZlo

Костыльное.

1. Выбрасывай исключение в методе, обрабатывай в main.

2. Вызывай метод вручную из main, проверяй результат.

unsigned ★★★★
()
Ответ на: комментарий от shty

В общем, прога хоть и консольная, но должна работать в event loop и управляться через socket. В конструкторе паршу некий конфиг, так что, если ошибка - выход.

drZlo
() автор топика
Ответ на: комментарий от drZlo

Это нормальное решение, во всяком случае я видел, чтобы подобное делалось где-то в кдеешном приложении. Как вариант, можешь попробовать invokeMethod с Qt::QueuedConnection.

Вообще, если ты говоришь, что должно управляться через сокет, то зачем тебе вызывать метод в конструкторе? В качестве теста?

rival ★★
()
Ответ на: комментарий от rival

> В качестве теста?

Ну да, при первом старте.

drZlo
() автор топика
Ответ на: комментарий от rival

зачем тебе вызывать метод в конструкторе

Например, разобрали конфиг, создали сокеты, прицепили сигналы к слотам, прицепили сокеты к портам, стали слушать. Это всё делается в конструкторе и сбой на люом этапе должен приводить к завершени. программы.

ТСу: вообще можно программу завершать функцией `exit'.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Ну да, так наиболее правильно будет. Просто хотелось сделать, что ли, более «по Qt'ешному» :)

drZlo
() автор топика
Ответ на: комментарий от Begemoth

> Это всё делается в конструкторе и сбой

Может быть не следует всё это делать в конструкторе?
Создать объект, после вызвать какой-нибудь listen(), который возвращает код ошибки в случае, если таковая произошла.

rival ★★
()
Ответ на: комментарий от drZlo

В общем, прога хоть и консольная, но должна работать в event loop и управляться через socket. В конструкторе паршу некий конфиг, так что, если ошибка - выход.

я бы оставил контруктору конструкторово, то есть конструирование объекта, а инициализацию вынес бы в отдельный метод

class Foo {
    bool init();
    bool method();
    bool inLoopMethod();
};
void term1_handler (int i) {
    QCoreApplication::exit(i);
}

bool Foo:init() {
    return method();
}

bool Foo::method() {
    ....

    if( /* failure condition */ ) { 
        return false;
    }
      
    return true;
}

void Foo::inLoopMethod {
    ...

    if( !method() ) {
        ::term1_handler(-1);
    }
}
int main(int argc, char * argv[]) {

    QApplication app(argc, argv); 1

    Foo foo;
    
    if( !foo.init() ) {
        return -1;
    }

    return app.exec();
};
shty ★★★★★
()
Ответ на: комментарий от drZlo

Ну да, так наиболее правильно будет. Просто хотелось сделать, что ли, более «по Qt'ешному» :)

рекомендую заглянуть в сорцы Qt, кутешнее не найти :)

shty ★★★★★
()

я бы сделал сигнал exit_application() и соединил бы его с QCoreApplication::quit()

connect({A instance}, SIGNAL(exit_application()), qApp, SLOT(quit()))
A::aMethod() {
      ....
      if( error )
         etim exit_application();
   }

mi_estas
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.