crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> правильная ли реализация, консольная утилита по обработке сетевого файла
rich
  опции профиля:
сообщение 6.8.2015, 23:31
Сообщение #1


Участник
**

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

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




Репутация:   0  


Задача:
Написать консольную утилиту которая получает файл по сети, обрабатывает его неким образом и завершается.
Реализация:
main.cpp:
Раскрывающийся текст

#include <QCoreApplication>
#include <check.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    check *cck = new check();
    if (cck->can_check){
        cck->do_check();
    }
    QObject::connect(cck, SIGNAL(done()), &a, SLOT(quit()));
    return a.exec();
}



check.cpp:

Раскрывающийся текст

#include "check.h"

check::check(QObject *parent) :
    QObject(parent)
    db = QSqlDatabase::addDatabase("AVAILABLE_DRIVER");
    // Далее коннект к базе
    can_check = db.open();
    if (!can_check) emit done();
}

void check::do_check(){
    fd = new FileDownloader(QUrl("URL_TO_FILE"));
    connect(fd, SIGNAL(downloaded()), SLOT(pars_file()));
}

void check::pars_file(){
    QString file_content = QString(fd->downloadedData());
    //  Анализ файла. Пишем результат в базу, не зря ж коннектились
}



нашёл где-то
filedownloader.cpp:
Раскрывающийся текст

#include "filedownloader.h"

#include "filedownloader.h"

FileDownloader::FileDownloader(QUrl fileUrl, QObject *parent) :
    QObject(parent)
{
    connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)),
                SLOT(fileDownloaded(QNetworkReply*)));
    //
    QNetworkRequest request(fileUrl);
    m_WebCtrl.get(request);
    //
}

void FileDownloader::fileDownloaded(QNetworkReply* pReply)
{
    m_DownloadedData = pReply->readAll();
    //emit a signal
    pReply->deleteLater();
    emit downloaded();
}

QByteArray FileDownloader::downloadedData() const
{
    return m_DownloadedData;
}



Так работает.
Не знаю что, но что-то мне не нравится.
А вам?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 7.8.2015, 13:05
Сообщение #2


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

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

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




Репутация:   8  


Из некритичного/отсутствующего.
1.
check *cck = new check();

cck не удаляется. Можно объявить локальной переменной(не указателем).
2. fd не удаляется (или не видно где удаляется)
3. "URL_TO_FILE" hardcoded.

Вообще мне все нравится, но я бы делал скачку файла отдельно, например через curl, а прога обрабатывала уже скачаный файл через pipe или еще как.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rich
  опции профиля:
сообщение 7.8.2015, 23:14
Сообщение #3


Участник
**

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

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




Репутация:   0  


Цитата(lanz @ 7.8.2015, 13:05) *
Из некритичного/отсутствующего.
1.
check *cck = new check();

cck не удаляется. Можно объявить локальной переменной(не указателем).
2. fd не удаляется (или не видно где удаляется)
3. "URL_TO_FILE" hardcoded.

Вообще мне все нравится, но я бы делал скачку файла отдельно, например через curl, а прога обрабатывала уже скачаный файл через pipe или еще как.

Как правильно или где правильно удалять fd?
Если удаляю в слоте, по завершению обработки, valgrind выдаёт следующее:
Раскрывающийся текст

Цитата
==25339== HEAP SUMMARY:
==25339== in use at exit: 104,418 bytes in 953 blocks
==25339== total heap usage: 42,329 allocs, 41,376 frees, 4,076,005 bytes allocated
==25339==
==25339== LEAK SUMMARY:
==25339== definitely lost: 3,682 bytes in 24 blocks
==25339== indirectly lost: 75,566 bytes in 310 blocks
==25339== possibly lost: 0 bytes in 0 blocks
==25339== still reachable: 25,170 bytes in 619 blocks
==25339== suppressed: 0 bytes in 0 blocks
==25339== Rerun with --leak-check=full to see details of leaked memory
==25339==
==25339== For counts of detected and suppressed errors, rerun with: -v
==25339== ERROR SUMMARY: 9 errors from 7 contexts (suppressed: 1 from 1)


При этом иногда программа завершается так:
Раскрывающийся текст

*** Error in `./check': corrupted double-linked list: 0x000000000088c410 ***
Аварийный останов (сделан дамп памяти)


а в gdb на 15й раз завершилась так:
Раскрывающийся текст

corrupted double-linked list: 0x0000000000687410 ***
Program received signal SIGABRT, Aborted.
0x00007ffff6841267 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:55
55    ../sysdeps/unix/sysv/linux/raise.c: Нет такого файла или каталога


Можно, конечно, скрестить ужа с ежом (bash с QT).
Наверно, например, так:
 whet URL_TO_FILE && ./parse FILE && rm FILE
.
и убрать вовсе класс FileDownloader, но хочеться только средствами QT :)

Сообщение отредактировал rich - 7.8.2015, 23:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 8.8.2015, 11:46
Сообщение #4


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

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

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




Репутация:   8  


Цитата
Как правильно или где правильно удалять fd?

Используйте deleteLater. С обычным delete объект удаляется, а потом управление возвращается в fileDownloaded уже удаленного объекта.

Цитата
Можно, конечно, скрестить ужа с ежом (bash с QT).

Не вижу в этом ничего предосудительного :lol:

Цитата
но хочеться только средствами QT :)

Но зачем?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rich
  опции профиля:
сообщение 8.8.2015, 13:09
Сообщение #5


Участник
**

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

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




Репутация:   0  


Цитата(lanz @ 8.8.2015, 11:46) *
Не вижу в этом ничего предосудительного

Я тоже, просто не подумал об этом варианте когда писал.
Цитата(lanz @ 8.8.2015, 11:46) *
Но зачем?

Во славу разработчиков QT, конечно. :)

Сообщение отредактировал rich - 8.8.2015, 13:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 10.8.2015, 9:24
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


Цитата(lanz @ 8.8.2015, 13:46) *
Цитата
Можно, конечно, скрестить ужа с ежом (bash с QT).

Не вижу в этом ничего предосудительного :lol:

Цитата
но хочеться только средствами QT :)

Но зачем?

если кроссплатформа не нужна, то, возможно, и незачем. а так, баш есть далеко не на всех системах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 10.8.2015, 10:51
Сообщение #7


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

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

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




Репутация:   8  


Цитата
а так, баш есть далеко не на всех системах.

А кто говорит про баш? ;)
http://curl.haxx.se/download.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rich
  опции профиля:
сообщение 10.8.2015, 11:06
Сообщение #8


Участник
**

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

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




Репутация:   0  


Цитата(Iron Bug @ 10.8.2015, 9:24) *
Цитата(lanz @ 8.8.2015, 13:46) *
Цитата
Можно, конечно, скрестить ужа с ежом (bash с QT).

Не вижу в этом ничего предосудительного :lol:

Цитата
но хочеться только средствами QT :)

Но зачем?

если кроссплатформа не нужна, то, возможно, и незачем. а так, баш есть далеко не на всех системах.

Как, у вас ещё нет баша?
Прикрепленное изображение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 11.8.2015, 9:35
Сообщение #9


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


Цитата(rich @ 10.8.2015, 13:06) *
Как, у вас ещё нет баша?

юзеры выбирают то, что им удобнее и привычнее. они ради твоей поделки точно не будут ставить какой-нить cygwin или unix utils. они просто не станут пользоваться поделкой.
кроссплатформенность означает не только код, но и нативность в рамках той оси, на которой работает программа. использование родных интерфейсов и стандартных утилит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 5.12.2024, 5:05