crossplatform.ru

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


  Ответ в правильная ли реализация
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Iron Bug Дата 11.8.2015, 9:35
 
Цитата(rich @ 10.8.2015, 13:06) *
Как, у вас ещё нет баша?

юзеры выбирают то, что им удобнее и привычнее. они ради твоей поделки точно не будут ставить какой-нить cygwin или unix utils. они просто не станут пользоваться поделкой.
кроссплатформенность означает не только код, но и нативность в рамках той оси, на которой работает программа. использование родных интерфейсов и стандартных утилит.
rich Дата 10.8.2015, 11:06
 
Цитата(Iron Bug @ 10.8.2015, 9:24) *
Цитата(lanz @ 8.8.2015, 13:46) *
Цитата
Можно, конечно, скрестить ужа с ежом (bash с QT).

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

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

Но зачем?

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

Как, у вас ещё нет баша?
Прикрепленное изображение
lanz Дата 10.8.2015, 10:51
 
Цитата
а так, баш есть далеко не на всех системах.

А кто говорит про баш? ;)
http://curl.haxx.se/download.html
Iron Bug Дата 10.8.2015, 9:24
 
Цитата(lanz @ 8.8.2015, 13:46) *
Цитата
Можно, конечно, скрестить ужа с ежом (bash с QT).

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

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

Но зачем?

если кроссплатформа не нужна, то, возможно, и незачем. а так, баш есть далеко не на всех системах.
rich Дата 8.8.2015, 13:09
 
Цитата(lanz @ 8.8.2015, 11:46) *
Не вижу в этом ничего предосудительного

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

Во славу разработчиков QT, конечно. :)
lanz Дата 8.8.2015, 11:46
 
Цитата
Как правильно или где правильно удалять fd?

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

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

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

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

Но зачем?
rich Дата 7.8.2015, 23:14
 
Цитата(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 :)
lanz Дата 7.8.2015, 13:05
  Из некритичного/отсутствующего.
1.
check *cck = new check();

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

Вообще мне все нравится, но я бы делал скачку файла отдельно, например через curl, а прога обрабатывала уже скачаный файл через pipe или еще как.
rich Дата 6.8.2015, 23:31
  Задача:
Написать консольную утилиту которая получает файл по сети, обрабатывает его неким образом и завершается.
Реализация:
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;
}



Так работает.
Не знаю что, но что-то мне не нравится.
А вам?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 4:26