Проблемы кроссплатформенности или какая есть альтернатива 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 шт):
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 это слабое место - не с того не с сего может решить, что в коде ошибка и разукрасить весь код красными сообщениями.