LINUX.ORG.RU

Сообщения Flassie

 

QtConcurrent, finished signal not emitted

После проблем возникших в этой статье, решил попробовать использовать QtConcurrent::run + QFuture + QFutureWatcher

Вполне возможно, что это я неудачник, или же это просто нехватка опыта использования QtConcurrent, но опять же результат разный на Windows и Linux (fedora)

Код:
Запуск потока:

            auto watcher = new QFutureWatcher<ParserTask *>(this);
            QObject::connect(watcher, SIGNAL(finished()), SLOT(taskFinished()));
            //QObject::connect(watcher, SIGNAL(canceled()), SLOT(taskFinished()));
            auto future = QtConcurrent::run(task, &ParserTask::run);
            watcher->setFuture(future);


taskFinished слот:
    void taskFinished() {
        auto watcher = static_cast<QFutureWatcher<ParserTask *> *>(QObject::sender());

        std::cout << "PARSED: "  << watcher->result()->result().size();
    }


Вывод на fedora без строчки «PARSER: *», на винде с этой строчкой

Что я не так делаю и как это исправить?

 , ,

Flassie
()

Qt Linux memory leaks

Здравствуйте

Имеется программа, написанная на Qt (С++), которая парсит входящие файлы и запихивает их в базу данных. Проблема заключается в том, что по каким-то непонятным причинам обьект, хранящий результат, не удаляется. А самое интересное заключается в том, что проблема происходит исключительно на линуксе (fedora).

Немного дополнительной информации:
1. Обработка каждого файла происходит в разных потоках. Создание нового потока реализовано в таком виде:

            QThread *_t = new QThread();

            QObject::connect(_t, SIGNAL(started()), task.data(), SLOT(run()), Qt::DirectConnection);
            QObject::connect(task.data(), SIGNAL(finished()), this, SLOT(taskFinished()));
            QObject::connect(_t, SIGNAL(finished()), _t, SLOT(quit()));
            QObject::connect(_t, SIGNAL(finished()), _t, SLOT(deleteLater()));
            QObject::connect(task.data(), SIGNAL(finished()), _t, SLOT(quit()));

            _t->start();
2. Расширение файла - CSV. Обработка файла осуществляется этой библиотекой
3. Обработанные данные кладутся в
    struct LineParseResult { QString article, brand, price, stock, multiplicity, __article, price_id; QByteArray key; };
    typedef QList<LineParseResult> PResult;
4. После того, как файл обработался и ParserTask заканчивает свою работу - эмитится сигнал finished(). Мы его ловим и получаем объект ParserTask'a:
        auto _task = qobject_cast<ParserTask *>(QObject::sender());
после чего ищем его в списке тасков, которые работают на данный момент и очищаем. Список выглядит таким образом:
QList<QSharedPointer<ParserTask>> m_currentRunningTasks;
и очистка памяти осуществляется таким образом:
                auto task = m_currentRunningTasks.takeAt(i);
                task.clear();
4. Платформо-зависимого кода в программе не имеется, за исключением того, что присутствует в самом Qt'e

После всех проделанных операций происходят разные вещи на Windows 10 и Linux, а именно программа, которая работает на Linux (диструбтив указан в начале) потребляет гораздо больше памяти, что не так страшно, как то, что память, которая занята после обработки файла, не очищается даже принудительно. На Windows же обратное, программа ест мало памяти и очищает ее после отработки

Программа была проверена валгриндом, который говорит, что утечек не имеется

Что это может быть и как с этим бороться?

 , ,

Flassie
()

Звук на hp pavilion m6 (1031er)

Здравствуйте.
Только сегодня начал разбираться с убунтой(13.04) и вроде все настроил, но единственное, что нормально настроить не удалось - звук.
Звук есть, но заглушенный(как в сломаных наушниках) и без сабвуферов. Пытался сделать по этому гайду:
http://ubuntuforums.org/showthread.php?p=12489414#post12489414
но звук стал только хуже.

Заранее благодарен.

P.S. Сносил пульсаудио, но утащила за собой половину гнома, хотелось бы узнать, как его правильно сносить?

 , , ,

Flassie
()

RSS подписка на новые темы