crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как корректно завершить консольное приложение?
Litkevich Yuriy
  опции профиля:
сообщение 29.10.2008, 12:28
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


делаю консольную программу
main.cpp

#include <QCoreApplication>
#include <iostream>

#include "controller.h"

const char * SW_VERSION = "0.1.0";

void showVersion()
{
    fprintf(stderr, "Scaner of DAQ's controller %s\n", SW_VERSION);
}

void showHelp(const char *appName)
{
    showVersion();

    fprintf(stderr, "Usage: %s [options] <file.ui>\n\n"
            " The demon-scaner of\n"
            " the controllers of the data acquisition system.\n\n"
            "  -h, --help                display this help and exit\n"
            "  -v, --version             display version\n"
            "\n", appName);
}
int main(int argc, char *argv[])
{

  QCoreApplication    app(argc, argv);
  Controller        ctrl(1000); // ms
    
    ctrl.setDB("DB", "USER", "PASSWORD");
    ctrl.run();
    
    return app.exec();
}


В классе Controller, устанавливается соединение с БД (Controller::setDB("DB", "USER", "PASSWORD")) и запускается таймер (Controller::run()), по ка по таймеру в консоль пишется счетчик, просто для видимости работы.

в pro-файле присутствуют такие строчки:
QT += sql
QT -= gui


Проблема:
При попытке завершить программу, либо закрытием окна консоли, либо <Ctrl>+<C> выскакивает ошибка типа: "Память не может быть прочитана, нарушение прав доступа".
Что нужно сделать чтоб этой ошибки небыло, и как корректно завершать работу консольного приложения.

Деструктор класса, как я предпологаю, не вызывается. А внем я удаляю соединение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 29.10.2008, 12:42
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Если Linux - обрабатывать системные сигналы.
Если Windows - сообщения консоли.

Ну или можно всю обработку пустить отдельным потоком, а в консоле, в главном потоке, просто ждать в цикле любого ввода - который и будет обозначать окончание. :)

Сообщение отредактировал Tonal - 29.10.2008, 12:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.10.2008, 12:48
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Tonal @ 29.10.2008, 15:42) *
Если Windows - сообщения консоли.
и как это можно в Qt'ях сделать? Я пологал что закрытие окна, кнопкой с крестиком, обрабатывается автоматически классом QCoreApplication.

Цитата(Tonal @ 29.10.2008, 15:42) *
просто ждать в цикле любого ввода
так это проц нагрузит, как я понимаю.

я попробывал в метод Controller::run() воткнуть удаление БД, это избавляет от ошибки, т.е. сам объект Controller , с его таймером, уничтожаются корректно. А вот с БД, возникает казус.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 1.11.2008, 13:54
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 29.10.2008, 15:48) *
Цитата(Tonal @ 29.10.2008, 15:42) *
Если Windows - сообщения консоли.
и как это можно в Qt'ях сделать? Я пологал что закрытие окна, кнопкой с крестиком, обрабатывается автоматически классом QCoreApplication.

Неверно полагал.
Это можно отследить только WinAPI. Qt тут не помощник.

Цитата(Litkevich Yuriy @ 29.10.2008, 15:48) *
Цитата(Tonal @ 29.10.2008, 15:42) *
просто ждать в цикле любого ввода
так это проц нагрузит, как я понимаю.

Ну тебе же всё равно нужно цикл сообщений крутить?
Вот в нём и проверять - есть что-нибудь на стандартном вводе или нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.12.2020, 5:48