2014-03-27 6 views
0

일부 계산을 실행하기 위해 현재 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을 사용하는 데 몇 가지 문제가있었습니다). 출력 리스너에 쓸 때 이것이 문제가됩니까?

+0

스레드를 사용할 때 당신은 Qt는 :: DirectConnection를 사용해서는 안 완료 될 때까지 추가 작업을 기다리는 스레드가보다 더 많은 작업을 추가 할 수 있습니다 작동합니다. Qt :: QueuedConnection에 문제가있는 경우 먼저 문제를 해결하십시오. – RobbieE

+0

스레드를 추가하기 전에 스레드가 완료 될 때까지 기다릴 필요가 없습니다. QThreadPool에 추가 된 QRunnable 객체의 수가 maxThreadCount보다 큰 경우 스레드가 사용 가능해질 때까지 대기열에 남아 있습니다. – RobbieE

+0

'A-> doSomeSetting()'내부에서 어떤 일이 발생합니까? 이것이 모든 계산이 일어나는 곳이면, 이것이 문제가있는 곳이며, 메인 프로세싱은'A-> run()'안에 있어야합니다. – RobbieE

답변

1

Qt :: DirectConnection이 문제 일 수 있습니다. 문서에서 말한 것처럼 스레드 연결에 Queded 연결을 사용해야합니다. waitForDone에 대한 모든 호출을 제거하고 당신은 개선을 볼 것이다 QueuedConnection 것입니다 : QFuture 및 QFutureWatcher와 QtConcurrent를 참조하십시오,이 클래스는 수행 할 모두마다 4 개 작업을 기다리고 있습니다 당신에게

1
m_thread_count++; 

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

도움이 될 수 있습니다 다시

당신은 다른 사람의 일이

+0

클래스 A를 수천 개 만들어서 바로 threadpool에 삽입하는 것이 좋습니다. 각 계산에는 약간의 시간이 걸리기 때문입니다. –

+0

@ JohnYang 완전히 좋지만, 약간의 메모리가 필요하지만 관리가 가능합니다. –

+0

waitForDone()을 제거하면 문제가 발생합니다. 프로그램은 4 개의 쓰레드가 생성되고 그 중 2 개의 쓰레드가 완료된 후 충돌했습니다. QueueConnection으로 바뀌었고 도움이되지 않습니다. –