일부 계산을 실행하기 위해 현재 QThreadPool을 사용하고 있지만, QThreadPool에 모든 것을 던지면 실제로 성능이 좋지 않으며 충돌 문제를 일으키는 것으로 나타났습니다. 그래서 내 생각은 한 번에 QThreadPool에 약간의 스레드 만 전달하는 것입니다. 아무도 QThreadPool을 사용하여 한 대의 PC에서 수천 번의 계산을 처리하는 방법에 대한 코드 나 예제를 공유 할 수 있는지 궁금합니다. 다음과 같이 뭔가를 작성했습니다,하지만 난 그게 (클래스 A가 QRunnable에서 상속) 순간에 나를 위해 약간의 충돌의 문제를 일으키는 느낌 :동시에 많은 수의 계산을 수행하는 QThreadPool
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를 사용해서는 안 완료 될 때까지 추가 작업을 기다리는 스레드가보다 더 많은 작업을 추가 할 수 있습니다 작동합니다. Qt :: QueuedConnection에 문제가있는 경우 먼저 문제를 해결하십시오. – RobbieE
스레드를 추가하기 전에 스레드가 완료 될 때까지 기다릴 필요가 없습니다. QThreadPool에 추가 된 QRunnable 객체의 수가 maxThreadCount보다 큰 경우 스레드가 사용 가능해질 때까지 대기열에 남아 있습니다. – RobbieE
'A-> doSomeSetting()'내부에서 어떤 일이 발생합니까? 이것이 모든 계산이 일어나는 곳이면, 이것이 문제가있는 곳이며, 메인 프로세싱은'A-> run()'안에 있어야합니다. – RobbieE