crossplatform.ru

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

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


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

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

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




Репутация:   12  


Цитата(silver47 @ 5.4.2011, 12:02) *
Простите. Совсем не понял. Объект "логгер" пишет в файл события, которые происходят при обработке данных другими классами, они кидают ему их посредством сигналов. Другие классы должны выполняться в лупе, то есть всегда, это не парсер чего-либо. Если они выполнили свою работу они уничтожаются, родительский класс создает новый объект, как только работа появиться. Надеюсь понятно объяснил.

Невижу никаких проблем с тем чтобы ваш "логгер" был глобальным в приложении (даже если он потомок 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();?

Если сделать все чисто по примеру, то вроде как не работает. Добавил консоль в сборку:
#include <QtCore/QCoreApplication>
#include <iostream>
#include <QTextCodec>
#include "mainapp.h"

void abnormalExit(){
    std::cout << "Abnormal exit";
}

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()));

    std::set_terminate(abnormalExit);
    return 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 вызывается, в другом нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.4.2024, 22:52