crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Как закрыть файл при закрытии приложения, Приложение консольное, не имеет видимых окон.
silver47
  опции профиля:
сообщение 5.4.2011, 9:35
Сообщение #1


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

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

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




Репутация:   6  


Приложение пишет лог в файл. Необходимо чтобы при закрытии приложения, собственно, этот лог сохранился. Не могу отловить событие закрытия
QObject::connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(appClose()));
. Деструктор тоже не выполняется. Может кто может помочь?

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 5.4.2011, 9:54
Сообщение #2


Участник
**

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

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




Репутация:   4  


окну нужно присвоить флаг deleteOnClose, вроде так пишется, тогда деструктор выполнится
ещё
closeEvent - у твоего главного окна есть такая виртуальная функция
а ещё стоит сохранять лог периодически, потому что программа может завершиться аварийно
не вижу ничего плохого в том, чтобы с каждой записью открывать и закрывать файл
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 5.4.2011, 10:30
Сообщение #3


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

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

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




Репутация:   6  


Цитата(abc @ 5.4.2011, 11:54) *
окну нужно присвоить флаг deleteOnClose, вроде так пишется, тогда деструктор выполнится
ещё
closeEvent - у твоего главного окна есть такая виртуальная функция
а ещё стоит сохранять лог периодически, потому что программа может завершиться аварийно
не вижу ничего плохого в том, чтобы с каждой записью открывать и закрывать файл


По поводу того, чтобы с каждой записью открывать и закрывать файл, сам только подумал и переделал уже. А вот про deleteOnClose, как присвоить его окну?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 5.4.2011, 11:02
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


QWidget* pWidget(new QWidget);
pWidget->setAttribute (Qt::WA_DeleteOnClose, true);

раз у тебя оконное приложение попробуй обработать сигнал от QApplication : void lastWindowClosed ().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 5.4.2011, 11:03
Сообщение #5


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

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

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




Репутация:   6  


Цитата(wiz29 @ 5.4.2011, 13:02) *
QWidget* pWidget(new QWidget);
pWidget->setAttribute (Qt::WA_DeleteOnClose, true);

раз у тебя оконное приложение попробуй обработать сигнал от QApplication : void lastWindowClosed ().


У меня оно не наследуется от QWidget. У меня нет окон - нечего закрывать.

Пока сделал так, чтобы файл с логом был всегда закрыт. открывается лишь на незначительное время для добавления записи, для решения задачи этого вполне достаточно. Но может все-же можно как-то понять, что твое приложение закрыли тем или иным образом? Вроде встречал на каком-то форуме, что платформонезависимо нельзя, но это касается только консольных приложений.

Сообщение отредактировал silver47 - 5.4.2011, 11:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 5.4.2011, 11:29
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


можешь линкануть код функции main?

просто в любом случае одной обработкой сигнала от QCoreApplication нельзя отделаться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 5.4.2011, 11:39
Сообщение #7


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

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

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




Репутация:   6  


Цитата(wiz29 @ 5.4.2011, 13:29) *
можешь линкануть код функции main?


main, в моем случае не делает ничего, кроме создания экземпляра класса и запуска лупа.
#include <QtCore/QCoreApplication>
#include <QTextCodec>
#include "mainapp.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //***************************************************************
    QTextCodec *codec=QTextCodec::codecForName("UTF8");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForCStrings(codec);
    //***************************************************************

    MainApp  aplication;

    QObject::connect(&aplication, SIGNAL(connectFailed()), &a, SLOT(quit()));

    return a.exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 5.4.2011, 11:50
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


объект "logger" синглтон в приложении?

если это так то все просто нужно немного модифицировать код твоего main и все будет в "шоколаде".
строку return a.exec(); поменяй на 2:
 int ret = a.exec();

 //закрыть логер

и вначале обязательно сделай переопределение стандартного обработчика "terminate handler function", это поможет тебе при завершении логера в случае непредвиденного завершения приложения. инфу можно посмотреть тут http://www.cplusplus.com/reference/std/exc.../set_terminate/

Сообщение отредактировал wiz29 - 5.4.2011, 11:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 5.4.2011, 12:02
Сообщение #9


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

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

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




Репутация:   6  


Цитата(wiz29 @ 5.4.2011, 13:50) *
объект "logger" синглтон в приложении?

если это так то все просто нужно немного модифицировать код твоего main и все будет в "шоколаде".
строку return a.exec(); поменяй на 2:
 int ret = a.exec();

 //закрыть логер

и вначале обязательно сделай переопределение стандартного обработчика "terminate handler function", это поможет тебе при завершении логера в случае непредвиденного завершения приложения. инфу можно посмотреть тут http://www.cplusplus.com/reference/std/exc.../set_terminate/


Простите. Совсем не понял. Объект "логгер" пишет в файл события, которые происходят при обработке данных другими классами, они кидают ему их посредством сигналов. Другие классы должны выполняться в лупе, то есть всегда, это не парсер чего-либо. Если они выполнили свою работу они уничтожаются, родительский класс создает новый объект, как только работа появиться. Надеюсь понятно объяснил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 5.4.2011, 12:02
Сообщение #10


Участник
**

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

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




Репутация:   4  


Wiz,
имеешь ввиду?
int res = a.exec();
file.close();
return res;

про terminate только на днях прочёл, оказывается, вот где можно использовать)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.2.2020, 16:59