Как закрыть файл при закрытии приложения, Приложение консольное, не имеет видимых окон. |
Здравствуйте, гость ( Вход | Регистрация )
Как закрыть файл при закрытии приложения, Приложение консольное, не имеет видимых окон. |
silver47 |
5.4.2011, 9:35
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
Приложение пишет лог в файл. Необходимо чтобы при закрытии приложения, собственно, этот лог сохранился. Не могу отловить событие закрытия
. Деструктор тоже не выполняется. Может кто может помочь?Спасибо. |
|
|
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 |
окну нужно присвоить флаг 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 |
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 |
можешь линкануть код функции main? main, в моем случае не делает ничего, кроме создания экземпляра класса и запуска лупа.
|
|
|
wiz29 |
5.4.2011, 11:50
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
объект "logger" синглтон в приложении?
если это так то все просто нужно немного модифицировать код твоего main и все будет в "шоколаде". строку return a.exec(); поменяй на 2:
и вначале обязательно сделай переопределение стандартного обработчика "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 |
объект "logger" синглтон в приложении? если это так то все просто нужно немного модифицировать код твоего main и все будет в "шоколаде". строку return a.exec(); поменяй на 2:
и вначале обязательно сделай переопределение стандартного обработчика "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,
имеешь ввиду?
про terminate только на днях прочёл, оказывается, вот где можно использовать) |
|
|
Текстовая версия | Сейчас: 27.4.2024, 19:35 |