2011-09-28 5 views
2

http://doc.qt.io/qt-5/qpointer.html에 따르면 QPointer가 매우 유용합니다. 그러나 나는 다음과 같은 상황에서 비효율적 일 수 있습니다 발견 :멀티 스레드 프로그램의 QPointer

내가 세 번 라벨을 표시하거나 다른 뭔가를하고 싶은 경우에, 나는

if(label) label->show1(); if(label) label->show2(); if(label) label->show3();

대신 사용해야 if(label) { label->show1();label->show2();label->show3(); }

레이블이 손상되었을 수 있기 때문에 다른 스레드label->show1(); 이후 r label->show2();.

같은 기능을 얻으려면 세 가지 ifs 이외의 아름다운 방법이 있습니까?

또 다른 질문은 if (label) 이후에 라벨이 삭제되면 if(label) label->show1();이 여전히 잘못 되었습니까?

멀티 스레드 프로그램에서 경험이 없습니다. 어떤 도움을 주셔서 감사합니다. ;)

+4

레이블은 if (label)와 label-> show1() 사이에서 삭제 될 수 있습니다. –

답변

6

내가 할 수있는 유일한 안전한 방법은 메인/GUI 스레드 (즉, QApplication :: exec() 내에서 Qt의 이벤트 루프를 실행하는 스레드)에서 QWidgets에 액세스하는지 확인하는 것입니다. .

다른 스레드에서 실행되는 코드가 있고 해당 코드가 QLabel을 표시하거나 숨길 것을 원하면 해당 코드는 QEvent 객체 (또는 그 서브 클래스)를 만들고 qApp-> postEvent()를 호출하여 해당 객체를 주 스레드로 보냅니다. 그런 다음 Qt 이벤트 루프가 주 스레드에서 해당 QEvent를 처리하고 처리 할 때 코드가 안전하게 QLabel에 작업을 수행 할 수있는 지점입니다.

스레드 코드가 크로스 스레드 신호 (here)를 내고 Qt가 내부적으로 이벤트 게시를 처리하도록 할 수도 있습니다. 그것은 당신의 목적에 더 좋을 수도 있습니다.

0

어느 접근법도 스레드로부터 안전하지 않습니다. 첫 번째 스레드가 if 문을 실행 한 다음 다른 스레드가 사용자의 레이블을 삭제하고 if 문에 충돌하고 충돌 할 수 있습니다.

Qt는 많은 스레드 동기화 구성을 제공하므로이 프로그램에서 계속 작업하기 전에 QMutex으로 시작하여 스레드 안전성에 대해 더 알고 싶을 것입니다.

같은 것을 보일 것이다 함수를 만들 수있는 뮤텍스를 사용 : 이

만큼 다른 스레드가 같은 뮤텍스 개체가 다음이 라벨을 삭제하는 것을 방지 것이라고 잠금 사용하면

mutex.lock(); 
label1->show(); 
label2->show(); 
label3->show(); 
mutex.unlock() 
보여주는하는 동안로를 그들.

+1

AFAIK Qt의 규칙은 "주 스레드가 아닌 스레드에서 GUI 개체를 만지지 마십시오"입니다. 특히, Qt의 주 스레드가 (부모 위젯을 통해) 해당 QLabel에 액세스하지 않는다는 보장이 없기 때문에 위의 호출을 둘러싼 뮤텍스 잠금을 설정하는 이벤트가 충분할지 확신 할 수 없습니다. 재 페인트를 위해, Qt는 뮤텍스를 잠그지 않을 것입니다. –