2010-05-26 3 views
1

서브 클래 싱 된 QThread를 포함하는 클래스로 승격 된 3 개의 위젯이있는 QMainWindow가 있습니다. 그것들은 재귀 적 qthread의 로컬 QImage에 그려집니다.이 Qthread는 그려진 신호와 함께 전송 된 다음 슬롯에서 update (mandlebrot 예제)를 호출하여 렌더링됩니다. 이것은 안전하거나 위험한가? 그들은 어떤 데이터도 공유하지 않습니다. 적어도 생성하고있는 것은 아니며 코딩 범위를 벗어나는 Qt가 자동으로 생성 한 데이터를 공유 할 수 있는지 궁금합니다. the documentation에서3 개의 별도 QThread에서 3 개의 별도 QImage를 그리는 것이 안전합니까?

+0

gtk는 실제로이 질문에 속하지 않습니다. –

답변

3

:

QPainter를가 QImage, QPrinter 및 QPicture 페인트 장치에 칠하는 데 사용할 수 있습니다. QPixmaps 및 QWidgets 로의 페인팅은 지원되지 않습니다. Mac OS X에서는 GUI 스레드 외부에서 인쇄하는 경우 자동 진행 대화 상자가 표시되지 않습니다.

임의의 수의 스레드는 주어진 시간에 페인트 할 수 있지만 한 번에 하나의 스레드 만 주어진 페인트 장치에 칠할 수 있습니다. 즉, 두 스레드가 각각 다른 QImages에 페인팅하면 동시에 페인팅 할 수 있지만 두 스레드는 동시에 같은 QImage에 페인팅 할 수 없습니다.

FontConfig 지원이없는 X11 시스템에서 Qt는 GUI 스레드 외부에서 텍스트를 렌더링 할 수 없습니다. QFontDatabase :: supportsThreadedFontRendering() 함수를 사용하여 글꼴 렌더링을 GUI 스레드 외부에서 사용할 수 있는지 여부를 감지 할 수 있습니다.

X11의 글꼴 문제에주의하는 한 Pixmap 또는 커서 (Pixmap으로 구현 됨)를 사용하지 말고 같은 이미지에 같은 그림을 그리지 마십시오 여러 스레드에서 시간 ... 작동합니다.

Mandelbrot 예제에서 QImage는 신호 (암시 적으로 공유 됨)를 통해 값으로 전달됩니다. 즉, 스레드가 쓰기를 시도하면 자체 복사본이 생성됩니다.

+0

오케이, 이것들은 내가 따라 왔던 가이드 라인이다. GDB의 모든 이슈를 생각해 볼 수 있겠는가? qthread에서 QLists를 사용하는 것이 안전합니까? –

+1

다중 스레드 코드 디버깅은 단일 스레드보다 항상 어렵지만 드로잉한다는 사실은이를 변경하지 않을 것입니다. QList와 같은 Qt 데이터 구조는 * 재진입 *이지만 스레드로부터 안전하지는 않습니다 * ... QReadWriteLock 또는 QMutex로 둘 이상의 스레드가 동일한 QList에 손을 넣을 수있는 경우이를 잠글 수 있습니다 시각. 참조 : http://doc.trolltech.com/4.6/threads-reentrancy.html – HostileFork

+0

다음 코드에서 seg 오류가 발생하는 것을 보았습니다. http://www.mediafire.com/?mwjlm3yltej 클래스는 자사의 데이터 멤버는 스레드 외부의 아무 것도 액세스하고 중단 점을 넣을 때만 seg 오류가 발생합니다. 나는 gdb의 잘못이라고 생각하고 싶다.하지만 그것은 드문 일이다. 런타임에는 결코 seg 오류가 발생하지 않는다. 클래스의 소스 코드를 세 번 복사하고 각 객체 인스턴스에 사용하면이 seg fault가 발생하지 않습니다. 코드를 단계별로 실행하면 GDB가이 모든 것에 대해 혼란 스러울 것이라고 생각하고 있습니다. –

관련 문제