crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 8:26