qt 스레드 예제

연결(작업자, SIGNAL()), 스레드, SLOT(종료)); start() 함수 호출은 스레드의 run() 함수를 자동으로 호출하고 start() 신호를 내보릅니다. 이 시점에서만 새 실행 스레드가 만들어집니다. run() 작업이 완료되면 스레드가 완료된() 신호를 방출합니다. 내 가정은, 인해 경주 조건 [1] QThreadPrivate 내부::마무리, 코드는 그러나 작동. 그것은 적어도 Qt 4.7에서 작동 하지만 QThread의 이후 버전에서 작동 하지 않을 수 있습니다. 내가 제대로 이해하면 qhtread::finished() 신호가 스레드의 컨텍스트에서 내보내므로 (qhtreadprivate::finish로 직접 호출), 실제로 완료() 완료되면 qthread가 완료되지 않습니다. 여기서 는 MyWorker 클래스가 예제에 있는 코드와 거의 동일합니다. 그것은 시작 될 때, 그것은 단지 프로세스()를 호출: maverikhardcoded, StackOverflow에서이에 대 한 훌륭한 주제가 있다: LogWorker 생성자의 구현에 http://stackoverflow.com/questions/10776509/qthreads-qobject-and-sleep-function 구현 하 고 logEvent는 간단하므로 여기에 제공되지 않습니다. 이제 스레드와 작업자 인스턴스를 관리하는 서비스가 필요합니다. start() 메서드는 새 스레드를 만들고 이 새 스레드에서 다시 구현된 run() 메서드를 호출합니다. start()가 호출된 직후 두 개의 프로그램 카운터가 프로그램 코드를 안내합니다. 주 함수는 GUI 스레드만 실행중인 것으로 시작하며 GUI 스레드만 실행하면 종료됩니다.

다른 스레드가 여전히 사용 중일 때 프로그램을 종료하는 것은 프로그래밍 오류이므로 run() 메서드가 완료될 때까지 호출 스레드를 차단하는 대기가 호출됩니다. 이것은 어떤 사람들이 `deleteLater`이벤트의 대기열에 대해 더 우려했던 것과 관련이있을 수 있습니다. Qt 4.8.3에서이 메서드를 사용하려고하지만이 예제에서 제시 된 코드는 QThread의 이벤트 루프가 `deleteLater`이벤트를 사용하기 위해 주어지는 즉시 액세스 위반으로 이어집니다. 이것은 또한 스레드에서 quit() 호출과 직접 관련이 있습니다. 프로그램 종료를 처리하지 않는 한 스레드를 삭제하고 종료를 기다릴 필요가 없습니다. 여기에 연결() 계열이 가장 중요한 부분입니다. 첫 번째 connect() 라인은 작업자의 오류 메시지 신호를 주 스레드의 오류 처리 기능으로 연결합니다.