crossplatform.ru

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


  Ответ в Как корректно завершить консольное приложение?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Tonal Дата 1.11.2008, 13:54
 
Цитата(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) *
просто ждать в цикле любого ввода
так это проц нагрузит, как я понимаю.

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

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

я попробывал в метод Controller::run() воткнуть удаление БД, это избавляет от ошибки, т.е. сам объект Controller , с его таймером, уничтожаются корректно. А вот с БД, возникает казус.
Tonal Дата 29.10.2008, 12:42
  Если Linux - обрабатывать системные сигналы.
Если Windows - сообщения консоли.

Ну или можно всю обработку пустить отдельным потоком, а в консоле, в главном потоке, просто ждать в цикле любого ввода - который и будет обозначать окончание. :)
Litkevich Yuriy Дата 29.10.2008, 12:28
  делаю консольную программу
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> выскакивает ошибка типа: "Память не может быть прочитана, нарушение прав доступа".
Что нужно сделать чтоб этой ошибки небыло, и как корректно завершать работу консольного приложения.

Деструктор класса, как я предпологаю, не вызывается. А внем я удаляю соединение.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 22:52