2016-07-14 21 views
0

Loggerウィンドウを使用しています。これは、QPlainTextEditを継承する簡単なウィジェットです。Qt QPlainTextEditがクラッシュする

私は同時にいくつかのメッセージを印刷する必要がありましたが(私はこのスレッドをmutexで安全にしました)、とにかくクラッシュします。これはgdbからのメッセージです

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff56c5cb9 in QTextLine::draw(QPainter*, QPointF const&, QTextLayout::FormatRange const*) const() 
from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 

私はQt 5.4を使用していますが、Qt 5.7を使用していますが、クラッシュが継続しています。誰かがヒントを持っていますか?私は他のウィジェットから継承すべきですか?

+3

コードサンプルなし – stryku

+1

GUI以外のスレッドからGUI関数を呼び出さないようにしてください。 –

+0

ミューテックスを使用する代わりに、非同期(つまりデフォルト)のシグナルスロット接続を使用してスレッドをシリアル化する方がよいでしょう。しかし、あなたがしていることを知ることは不可能です。あなたの質問を編集して、問題を示す最小の完全な例を追加してください。 –

答えて

0

人々が上でコメントしたように、問題はおそらくあなたのやり方にあります。あなたの状況をどのように処理するかについては、ここで推奨される方法です:QThreadを使用し、ミューテックスを使用しないでください。

Qtは、スレッドセーフ通信にシグナル/スロットを使用します。

class A : public QObject 
{ 
    Q_OBJECT 

    // ... 

public slots: 
    void run(); 
} 

あなたは別の新しいスレッドで実行したい任意のクラスはあなたが好きなもの、それを呼び出すことができ、「実行」のスロットを必要とするが、最初のit's:あなたがすぐに始める方法についての例あなたは以下の実装では、それを開始すると、新しいスレッドで呼び出される機能:

// Create and start the thread 
QThread *t = new QThread; 
t->start(); 

// Create an object of your class and move it to the thread 
A* a = new A(); 
a->moveToThread(t); 

// Now actually run it in the thread through the signal slot system 
QMetaObject::invokeMethod(a, "run", Qt::QueuedConnection); 

私は質問があれば私に知らせて、それはそれは明らかにしたいと考えています。

関連する問題