В настоящее время я использую 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). Будет ли это проблемой при записи на выходной приемник?
Qt :: DirectConnection может быть проблемой. Как сказано в документации, для многопоточности необходимо использовать Queded соединение. Посмотрите QtConcurrent с QFuture и QFutureWatcher, этот класс может вам помочь
m_thread_count++;
if(m_thread_count >0 && m_thread_count %m_maxThreadInPool == 0)
{
QThreadPool::globalInstance()->waitForDone();
}
вы ждете каждые 4 задачи для все из них нужно сделать: удалите все вызовы waitForDone, и тогда вы увидите улучшение и QueuedConnection
снова будет работать
Вы можете добавить больше задач, чем потоков, дополнительные задачи будут ждать, пока одна из других не будет выполнена.