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 подписка на новые темы