実現したいこと
Qtアプリケーションにおいてログウィンドウにメッセージを表示したいのですが、別スレッドからメッセージを送出すると以下のようなエラーが発生します。
ソースコードは自作ストリーム (qDebugの様なモノでメッセージがあるとnewされ、送出後直ちにdeleteされる) の書き込みを担当しているクラスで、シングルトンのstaticオブジェクトとなっています。
複数のスレッドからのメッセージを収集して一括表示するのが目標です。
似たようなエラーの質問は海外サイトにありましたが、状況が異なるので解決できませんでした。
当方、初のQtプログラミングなので仕様が一部のみしか理解できておりません。
上手く処理できるアイデア及び機能をご教授願います。
エラーメッセージ
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 0x0x25781816150. Receiver '' (of type 'QTextDocument') was created in thread 0x0x257fcc74600", file kernel\qcoreapplication.cpp, line 578
ソースコード(抜粋)
C++
1 class Logger{ 2 public: 3 void Init(QTextEdit* p) { 4 _TextEdit = p; 5 //省略.. 6 } 7 8 void Write(const std::string& str){ 9 if (_TextEdit) { 10 std::string tmp = str; 11 _LogBuffer.emplace_back(tmp); 12 13 if (_LogBuffer.size() > MAX_LOGGING_MESSAGE) { 14 _LogBuffer.pop_front(); 15 } 16 //ここでアサート↓ 17 _TextEdit->clear(); 18 for (auto it = _LogBuffer.cbegin(); it != _LogBuffer.cend(); ++it) { 19 //ここでも怒られるはず 20 _TextEdit->append(QString(it->c_str())); 21 } 22 } 23 //省略.. 24 } 25 26 static Logger& GetInstance() { 27 static Logger instance; 28 return instance; 29 } 30 31 private: 32 Logger() : _TextEdit(nullptr){} 33 ~Logger() { /*省略..*/ } 34 35 std::list<std::string> _LogBuffer; 36 QTextEdit* _TextEdit; 37 };
試したこと
排他制御などを試してみましたが頓挫してしまいました。
補足情報(ツールのバージョンなど)
Microsoft Visual Studio 2019(v142)
Qt 5.12.6
Qt Visual Studio Tools version 2.4.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/23 12:54