Проблемы кроссплатформенности или какая есть альтернатива QtConcurrent::run?

Нужно запустить асинхронно функцию в отдельном потоке, я использовал QtConcurrent::run все было отлично когда я тестировал windows, но стоило мне запустить тот же код на linux, как он стал работать синхронно.

Тестируемый код:

void myRunFunction(QString name)
{
    for(int i = 0; i <= 1000; i++)
        qDebug() << name << " " << i << "from" << QThread::currentThread();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFuture<void> t1 = QtConcurrent::run(myRunFunction, QString("A"));
    QFuture<void> t2 = QtConcurrent::run(myRunFunction, QString("B"));
    QFuture<void> t3 = QtConcurrent::run(myRunFunction, QString("C"));

    t1.waitForFinished();
    t2.waitForFinished();
    t3.waitForFinished();

    return a.exec();
}

Подскажите как это исправить, ну или что можно еще попробовать?

Есть еще непонятка с QtConcurrent::run при вызове функций класса. На clang выдает следующее: no matching function for call to 'run'. Поменял компилятор на mingw и ошибка изменилась на reference to non-static member function must be called

Тестовый код:

void A(int a)
{
    qDebug() << a;
}

class my_class : public QObject
{
    Q_OBJECT

public:
    my_class(){}
    void B(int a)
    {
        qDebug() << a;
    }
    void call()
    {
        QtConcurrent::run(B, 5);// не работает
        QtConcurrent::run(A, 5);// работает
    }

};

Qt 4.8

Англоязычная версия вопроса


Ответы (1 шт):

Автор решения: KoVadim

QtConcurrent::run использует QThreadPool по умолчанию, который сам определяет, сколько именно потоков делать. Для этого он использует системные функции, это же значение доступно через QThread::idealThreadCount(). Есть некая гарантия, что это значение будет как минимум равно 1.

Что делать? создать пул самому. Где то так

pool = new QThreadPool(this); 
pool->setMaxThreadCount(36); // нам нужно будет 36 потоков, у нас АМД, мы его проверяем
// а тут просто ещё один параметр, и все как обычно
QFuture<void> future = QtConcurrent::run(&pool, myRunFunction, QString("A"));

Иногда есть проблема вызова QtConcurrent::run с функциями класса, выдает следующее: no matching function for call to 'run'

надо смотреть код. Но есть подозрение, что это не ошибки компиляции, а ошибки "подсказок кода". У QtCreator это слабое место - не с того не с сего может решить, что в коде ошибка и разукрасить весь код красными сообщениями.

→ Ссылка