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

В настоящее время я использую QThreadPool для выполнения некоторых вычислений, но, тем не менее, я обнаружил, что если я добавлю все в QThreadPool, он на самом деле работает не очень хорошо и, похоже, вызывает некоторую проблему сбоев. Поэтому моя идея состоит в том, чтобы в QThreadPool одновременно передавалось только несколько потоков. Интересно, кто-нибудь может поделиться каким-нибудь кодом или примером того, как использовать QThreadPool для обработки тысяч вычислений на одном ПК. Я написал что-то вроде следующего, но я чувствовал, что в данный момент у меня возникли некоторые проблемы (класс A унаследован от QRunnable):

for(int i=0;i<1000;i++)
{
Class* A = new Class();
A->doSomeSetting(i);

A->setAutoDelete(true);

connect(A,SIGNAL(OutputProvider(int))
,this,SLOT(OutputListener(int)),Qt::DirectConnection);

QThreadPool::globalInstance()->start(A);

m_thread_count++;

if(m_thread_count >0 && m_thread_count %m_maxThreadInPool == 0)
{
QThreadPool::globalInstance()->waitForDone();
}
}
QThreadPool::globalInstance()->waitForDone();

И инициализированная настройка:

m_maxThreadInPool = 4;
QThreadPool::globalInstance()->setMaxThreadCount(4);
m_thread_count = 0;
std::vector<int> output;

Выходной слушатель:

void OutputListener(int output)
{
output.push_back(output);
}

Это правильный способ сделать это или есть лучшие способы?

Также, при настройке максимального количества потоков, максимальное число, которое вы можете ввести, это количество ядер, которое вы можете иметь?

Я также использую Qt :: DirectConnection (у меня была некоторая проблема с использованием QueueConnection). Будет ли это проблемой при записи на выходной приемник?

1

Решение

Qt :: DirectConnection может быть проблемой. Как сказано в документации, для многопоточности необходимо использовать Queded соединение. Посмотрите QtConcurrent с QFuture и QFutureWatcher, этот класс может вам помочь

2

Другие решения

m_thread_count++;

if(m_thread_count >0 && m_thread_count %m_maxThreadInPool == 0)
{
QThreadPool::globalInstance()->waitForDone();
}

вы ждете каждые 4 задачи для все из них нужно сделать: удалите все вызовы waitForDone, и тогда вы увидите улучшение и QueuedConnection снова будет работать

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

1