非 GUI スレッドで実行している QWidget::update() でアプリケーションがクラッシュすることがあります。
リモートホストからビデオフレームを受信して QWidget に表示するアプリケーションを開発しています。
この目的のために、デコードされた画像を提供する libVLC ライブラリを使用します。別の libVLC スレッドで実行されている libVLC コールバックでイメージを受け取ります。このコールバックでは、QWidget::update() メソッドを実行しようとしています。アプリケーションがクラッシュする場合があり、コールスタックはこのメソッドのどこかにあります。これが私のコールバックコードです:
//! Called when a video frame is ready to be displayed, according to the vlc clock.
//! \c picture is the return value from lockCB().
void VideoWidget::displayCB(void* picture)
{
QImage* image = reinterpret_cast<QImage*>(picture);
onScreenPixmapMutex_.lock();
onScreenPixmap_ = QImage(*image);
onScreenPixmap_.detach();
onScreenPixmapMutex_.unlock();
delete image;
update();
}
Qt では、メイン スレッド外での GUI 操作が許可されていないことを知っています。しかし、ドキュメント QWidget::update() によると、Qt がメイン イベント ループに戻ったときに処理するためのペイント イベントをスケジュールするだけで、すぐに再ペイントは行われません。
問題は、「メイン スレッド外の GUI 操作は許可されない」という規則が QWidget::update() に適用されるかどうかです。この操作は「GUI操作」に属しますか?
私は Qt 4.7.3 を使用しています。クラッシュは Windows 7 と Linux で再現されます。