누구나 QThreadPool 클래스에서 "reserveThread"및/또는 "releaseThread"를 사용하는 예제를 제공 할 수 있습니까? 나는이 문서를 읽었지만, 당신이이 기능들을 언제 사용하는지 정말로 모르겠습니다. 인터넷 검색 사례가 비어 있습니다.QThreadPool reserveThread 예제
저는 PySide를 사용하고 있기 때문에 Python을 선호하지만 C++ 또한 좋습니다.
누구나 QThreadPool 클래스에서 "reserveThread"및/또는 "releaseThread"를 사용하는 예제를 제공 할 수 있습니까? 나는이 문서를 읽었지만, 당신이이 기능들을 언제 사용하는지 정말로 모르겠습니다. 인터넷 검색 사례가 비어 있습니다.QThreadPool reserveThread 예제
저는 PySide를 사용하고 있기 때문에 Python을 선호하지만 C++ 또한 좋습니다.
이 메서드는 스레드 풀을 수동으로 관리하는 스레드와 상호 운용하는 데 사용됩니다.
스레드 풀은 활성 스레드 수를 유지하고 해당 스레드가 주어진 하드웨어에서 이해할 수있는 최대 스레드 수를 초과하지 않도록합니다. reserveThread
및 releaseThread
은 풀이 인식하는 활성 스레드 수를 변경합니다. 풀에서 스레드를 직접 추가하거나 제거하지 않습니다. 이 메소드가 QThread
을 리턴하지 않는다는 것은 오류가 아닙니다.
reserveThread
의미 : "나는 당신 아니더라도 (스레드 풀의)
releaseThread
의미 활성화 될 나의 스레드를 고려하시기 바랍니다, 내가 다른 곳에서 관리 스레드를 사용하고 있습니다."나는 아니에요 더 이상 내 스레드를 사용하여, 활성 사용자 스레드의 이상을 주시기 바랍니다 "
예 :. 네 논리적 CPU 시스템을 고려 코드는 C++입니다 처음
:..
을QThreadPool pool;
assert(pool.maxThreadCount() == 4);
assert(pool.activeThreadCount() == 0);
전용 계산 스레드를 시작합니다. 하나의 코어가 사용 중입니다. 당신은 reserveThread
를 호출하여 풀을 통보 :
MyWorker worker;
QThread thread;
worker.moveToThread(&thread);
thread.start();
pool.reserveThread();
assert(pool.activeThreadCount() == 1);
수영장 어떤 스레드 자체가 실행되지 않습니다!
각 runnables를 제출하는 데 시간이 조금 걸립니다. 수영장은이를 실행하기 위해 세 개의 추가 스레드를 만듭니다
QAtomicInt act = 0;
QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); });
QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); });
QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); });
QtConcurrent.run(&pool, [&]{ act.ref(); QThread::sleep(60); act.deref(); });
QThread::sleep(1);
assert(pool.activeThreadCount() == 4);
assert(act.load() == 3);
단지 3 개보다 Runnable 지금 활성, 1 ~ 4 중 스레드가 예약되어 있기 때문에 활성 수 없습니다 : 그것은에 실행 할 CPU가없는 것, 때문에 스레드가 바쁘다.
계산 스레드가 완료되고 하나의 코어를 확보하십시오. 당신은 releaseThread
를 호출하여 풀을 통보 : 추가 실행 가능한 대기가 있었다 때문에, 쓰레드가 실행 가능한 가야하는 활성화 된
thread.quit();
thread.wait();
pool.releaseThread();
QThread::sleep(1);
assert(pool.activeThreadCount() == 4);
assert(act.load() == 4);
. 잠시 후
QThread::sleep(60);
assert(pool.activeThreadCount() == 0);
assert(act.load() == 0);
아, 내가 지금 볼 수는. 그리고 쓰레드 풀이 이미 4 개의 실행 쓰레드를 가지고 있고 (최대 쓰레드 개수가 4라고 가정 할 때),'reserveThread'를 호출하면,'activeThreadCount'는 최대 쓰레드 카운트보다 높더라도 일시적으로 5까지 올라갑니다. 실행중인 쓰레드 중 하나가 끝나면'activeThreadCount'가 4로 돌아갑니다. 설명해 주셔서 감사합니다. –