我使用QPlainTextEdit來顯示一些文本。本文將在另一個線程比UI(主)線程修改(追加)與發送信號到微件訪問Qt窗口線程安全
connect(this, SIGNAL(addText(QString)), mUi->plainTextEditLog, SLOT(appendPlainText(QString)));
...
emit addText(QString::fromStdString(someString));
...
另一個線程讀取該PlainTextEdit的文本,並將其寫入一個文件
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {
return;
}
file.write(mUi->plainTextEditLog->toPlainText().toUtf8());
file.close();
就我所知,Qt小部件不是線程安全的。我想過一個互斥鎖來鎖定寫入信號發出,但這不會鎖定它,因爲它只是異步發送信號。
我使用信號的原因是寫入方法可以從多個線程中調用,互斥量在這種情況下無助於信號,但信號完美無缺。
第二個想法是將文本也存儲在我的課堂上,並通過互斥來鎖定字符串。但我不確定這是否非常有效,因爲不僅需要修改plaintextedit,而且還要將字符串作爲副本。
爲你的第二種方法,當一切正常時擔心效率,**真**太慢。 –
「我想過一個互斥鎖來鎖定寫入信號發出」<---沒必要。信號/插槽連接自動'線程安全'。 – Greenflow
檢查你的Qt文檔並搜索:Qt :: QueuedConnection – Greenflow