Как закрыть файл при закрытии приложения, Приложение консольное, не имеет видимых окон. |
Здравствуйте, гость ( Вход | Регистрация )
Как закрыть файл при закрытии приложения, Приложение консольное, не имеет видимых окон. |
wiz29 |
5.4.2011, 12:22
Сообщение
#11
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Простите. Совсем не понял. Объект "логгер" пишет в файл события, которые происходят при обработке данных другими классами, они кидают ему их посредством сигналов. Другие классы должны выполняться в лупе, то есть всегда, это не парсер чего-либо. Если они выполнили свою работу они уничтожаются, родительский класс создает новый объект, как только работа появиться. Надеюсь понятно объяснил. Невижу никаких проблем с тем чтобы ваш "логгер" был глобальным в приложении (даже если он потомок QObject) или же у вас есть некий общий файл в который все "сливается" с разных объектов (т.е. разделенный доступ к лог файлу)? (тогда здесь не все понятно с синхронизацией доступа к файлу). p.s. Что конкретно не понятно? (синглтон - объект одиночка для всего приложения, в qt например, это QCoreApplication объект, как правило имеет метод instance() или нечто подобное) кстати обработка сигнала aboutToQuit нормально работает только при корректном завершении приложения: вызовом метода QCoreApplication::instance()->quit(); в остальных случая код завершения не 0 и сигнал не генерится. |
|
|
silver47 |
5.4.2011, 12:41
Сообщение
#12
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: 6 |
Логгер глобальный и один для всех объектов.
Конкретно не понятно как работает set_terminate. По примеру мы устанавливаем метод, который будет вызываться в случае ненормального завершения программы. Это так? зачем тогда заменять a.exec(); на int res = a.exec();? Если сделать все чисто по примеру, то вроде как не работает. Добавил консоль в сборку:
По Ctrl+C тихо закрывается. Ничего не оставляет после себя. Если вставить throw; до return a.exec() то исключение вызывает метод abnormalExit. Сообщение отредактировал silver47 - 5.4.2011, 12:57 |
|
|
wiz29 |
5.4.2011, 13:26
Сообщение
#13
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
1. менять не обязательно.
2. std::set_terminate работает следующим образом: если в какойто части программы возникает исключительная ситуация exception и данная ситуация не обработана ни одним перехватчиком искл. ситуаций то приложение аварийно завершается, перед своим завершением вызываться некая специальная глобальная функция terminate handler , собственно указатель на нее и устанавливает данный метод (это коротко , на "палцах") за более подробной инфой обратитесь к справочникам по C++. При закрытии консольного окна "через крестик" реально сам не смог отловить завершение. Средставми Qt закрытие консоли с помощью Сtr + C или Alt + F4 скорее всего обработать не выйдет, придется писать платформозависимый код. (других путей пока не вижу) |
|
|
Алексей1153 |
5.4.2011, 17:05
Сообщение
#14
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
вообще говоря, достаточно просто всегда записывать данные в файл. Когда приложение умирает, система закрывает все дескрипторы, занятые приложением - файл автоматом закроется. По крайней мере в винде так
|
|
|
abc |
5.4.2011, 19:33
Сообщение
#15
|
Участник Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: 4 |
Алексей, что происходит здесь?
http://www.forum.crossplatform.ru/index.php?showtopic=6720 |
|
|
Алексей1153 |
5.4.2011, 19:42
Сообщение
#16
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
abc,
ну да, если что-то не успело записаться, то оно и не сохранится. А по топику в ссылке, навскидку: вызывать flush после каждой записи - это гарантия перекидывания в файл из внутренних буферов. А close там ни при чём ИМХО опять же, тонкости работы линукса я не знаю, а в винде файл просто закроется и ничего не потеряется из уже в него записанного Сообщение отредактировал Алексей1153 - 5.4.2011, 19:42 |
|
|
abc |
5.4.2011, 20:06
Сообщение
#17
|
Участник Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: 4 |
я в винде компилировал, QString не пишется, QPixmap пишется... Как может не успеть записаться? дальше этих двух типов не проверял
Сообщение отредактировал abc - 5.4.2011, 20:08 |
|
|
Алексей1153 |
5.4.2011, 20:17
Сообщение
#18
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
abc, а с flush тоже не пишется ?
|
|
|
abc |
5.4.2011, 20:20
Сообщение
#19
|
Участник Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: 4 |
не пробовал, но если даже пишется, то вопрос изменится на - почему QString записать нужен flush, а QPixmap нет...
|
|
|
Алексей1153 |
5.4.2011, 20:25
Сообщение
#20
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
abc, возможно, оператор << у них по разному устроен - в одном flush вызывается, в другом нет
|
|
|
Текстовая версия | Сейчас: 19.4.2024, 22:52 |