Jumping Bytes and Hopping Bits
the church of tech
Menu

qtconcurrent 예제 August 2, 2019

세 스레드가 깨어나는 순서는 정의되지 않습니다. 또한 키를 누를 때 일부 스레드가 do_something()에 있는 경우 조건 변수를 기다리지 않으므로 잠에서 깨어날 수 없으므로 해당 키 누에 대해 작업이 수행되지 않습니다. 이 문제는 카운터와 QMutex를 사용하여 해결할 수 있습니다. 예를 들어, 다음은 작업자 스레드에 대한 새 코드입니다: 별도의 스레드에서 코드를 실행하도록 하는 또 다른 방법은 QThread를 하위 클래스화하고 run()을 다시 구현하는 것입니다. 예를 들어 이 섹션에서는 이전 예제QThread – 훨씬 더 짧고 간결한 방식으로 스레드 만들기와 동일한 출력을 얻습니다. QFuture는 또한 런닝 계산과 상호 작용하는 방법을 제공합니다. 예를 들어 cancel() 함수를 사용하면 계산을 취소할 수 있습니다. 계산을 일시 중지하려면 setPaused() 함수 또는 pause(), resume() 또는 togglePaused() 편의 함수 중 하나를 사용합니다. 모든 비동기 계산을 취소하거나 일시 중지할 수 있는 것은 아닙니다. 예를 들어 QtConcurrent::run()에서 반환된 미래는 취소할 수 없습니다. 그러나 QtConcurrent에 의해 반환 된 미래 ::mappedReduced () 할 수 있습니다. 이 예제 함수는 개발될 수록 더 복잡해지므로 오류가 발생할 가능성이 높아집니다. 다음은 QReadLocker를 사용하여 읽기를 위한 읽기 잠금 잠금을 해제하는 예제입니다.

세마포는 레스토랑의 의자 수와 함께 초기화됩니다. 사람들이 도착하면, 그들은 좌석을 원한다. 좌석이 채워질 때 사용 가능()이 감소됩니다. 사람들이 떠날 때 사용 가능한()가 증가하여 더 많은 사람들이 입장할 수 있습니다. 10인의 정당이 의석을 차지하고 싶지만 10석만 기다린다면 10명이 앉을 수 있지만, 4인 의석이 5석으로 자리를 비우면 10명이 더 기다려야 한다. 예를 들어 별도의 스레드에서 QByteArray::split(const member function)을 호출하는 작업은 다음과 같이 수행됩니다. 예를 들어 QtConcurrent::run()에서 반환된 미래는 취소할 수 없습니다. 그러나 QtConcurrent에 의해 반환 된 미래 ::mappedReduced () 할 수 있습니다.

이는 QtConcurrent::mapped()가 기대하는 것과 일치하며 전체 예제는 시퀀스의 모든 항목에 배율 함수를 적용하는 방법을 보여 주며 현재는 여전히 매우 간단한 예입니다. 더 복잡하게 만들어 봅시다. 이 예제에서는 실행 함수가 반환된 후 스레드가 종료됩니다. exec()를 호출하지 않는 한 스레드에서 실행되는 이벤트 루프는 없습니다. 예를 들어, 이 복잡한 함수는 함수를 입력할 때 QMutex를 잠그고 모든 출구 지점에서 뮤텍스의 잠금을 해제합니다. 아래 코드에서 비동기 ImageReader 클래스를 보여 주며 있습니다. readImageWorker 함수는 UI를 차단 하지 않습니다 다른 스레드에서 실행 됩니다. QFuture는 계산 결과를 나타내고 상태 변경을 보고합니다. 그런 다음 지정된 시간에 하나의 스레드만 번호를 수정할 수 있으며 결과가 정확합니다. 이것은 사소한 예입니다 (물론, 일이 특정 순서로 일어나야하는 다른 경우에 적용됩니다) . 함수에 인수를 전달하는 것은 함수 이름 바로 직후QtConcurrent::run() 호출에 인수를 추가하여 수행됩니다.

예를 들어 위의 예제는 매우 이상적인 경우입니다.

Categories: Uncategorized