2017-05-03 23 views
0

나는 블렌더를위한 렌더 작업 관리자를 만들고 있습니다. 렌더링 작업 대기열을 작성한 클래스가 있고 시작을 클릭하면 루프가있는 한 번에 하나씩 렌더링이 시작됩니다. 내 문제는 waitForFinished() 메서드가 내 전체 프로그램을 유지한다는 것입니다. 그러나 나는 QThreadQProcess과 함께 사용해서는 안된다는 것을 읽었습니다.QThread를 QProcess와 함께 사용할 적절한시기입니까?

루프가 작동하는 방식입니다.

do{   
if(myProcess->state() == QProcess::NotRunning) { 

      myProcess->setProgram(blenderPath); 
      myProcess->setArguments(arguments); 
      myProcess->start(); 
      myProcess->waitForFinished(-1); 

      //Get rid of current rendering job to prepare for the next job 
      renderQueueList.pop_front(); 
     } 

     }while(renderQueueList.empty() != true); 

나는 QProcess를 시작하기 위해 별도의 스레드를 사용할 수 무엇은이 작업을 수행하는 가장 좋은 방법이 있을까요? 나는 당신이 QThread의 추상을 만들거나 신호와 슬롯을 사용한다는 것을 읽었지만 너무 혼란 스럽다. 특별히 프로세스에 인수를 전달할 필요가있을 때.

감사합니다.

편집 : 새 프로세스를 실행하기 전에 프로세스가 완료되어야한다고 추가하고 싶습니다. 순서대로 가야합니다. 그렇기 때문에 프로세스를 자체 스레드로 실행해야한다고 생각합니다.

+1

그냥 'finished()'신호를 듣지 않는 이유는 무엇입니까? – MrEricSir

+0

@MrEricSir 맞습니다 .... 여기에 기사가 있습니다 http://www.qtcentre.org/threads/26067-Article-How-to-QProcess-in-QThread – Naidu

+0

저는 혼란 스럽습니다. 기사에서는 새 스레드에서 프로세스를 만드는 방법을 보여 주지만 의견 작성자는 이것이 잘못되었다고 말하고 있습니다. 무엇 이니? – LetTheWritersWrite

답변

1

QProcess는 이미 다른 프로세스, 즉 애플리케이션과 비동기 적으로 실행됩니다.

waitForFinished()를 호출하면 QProcess의 프로세스가 완료 될 때까지 응용 프로그램이 잠 깁니다. 대신 finished() 및 아마도 errorOccured() 신호에 연결해야하며 QProcess가 백그라운드에서 실행되는 동안 응용 프로그램이 계속 실행됩니다.

대기열이 비어 있지 않고 새 프로세스가 finished() 신호에서 시작하는지 루프로 변경해야합니다.

QProcesses를 실행하는 QThread를 실행하고 waitForFinished()를 수행하면 주 응용 프로그램 스레드를 실제로 해제 할 수 있지만 QProcess가 이미 비동기 인 경우 무의미한 추가 레이어이며 완료되면() 완료했을 때 알려줍니다 UI 스레드 또는 별도의 스레드 일 수 있습니다.

+0

에서 좋은 예제가 있습니다. 프로세스의 'finished()'신호에 액세스해야합니다. 나는'QProcess :: NotRunning'이 제 코드에서 작동하지 않는다는 것을 깨달았습니다. 내가 어딘가에서 읽을 수는 있지만 완전히 틀렸다. 그래서 당신이 제안하는 각각의 마친 후 내 함수를 시작하는 재귀 연결을 만드는 것입니다, 그리고 내 함수 내에서 난 그냥 빈 QList를 확인하는 문을 가지고 있습니다. 연결을 도와 주시겠습니까? 나는 문서가 말하는 것을 이해할 수 없다. 그들은 람다 (lambda)를 사용하고 객체를 만들 필요가 있는지 또는 연결을 만들기 위해 필요한 것을 지정해야 하는지를 지정하지 않습니다. – LetTheWritersWrite

+0

연결을 만들고 슬롯 위에 위의 코드를 작성하여 재귀 적으로 호출하는 방법을 알아 냈습니다. 완벽하게 일했습니다! 'do while' 루프를 없애고 if 문으로 대체하여 renderQueueList가 비어있는 경우 다시 확인한 다음 프로세스를 다시 시작합니다. 정말 고마워! – LetTheWritersWrite