从多个OS线程

时间:2016-11-10 23:04:22

标签: c++ multithreading qt

我有一个现有的多线程应用程序,我正试图将一个非常简单的QT GUI打到前端。

特别是,我尝试使用QPlainTextEdit对象实现一个非常简单的日志。每当其中一个操作系统线程启动某个操作时,我就会通过调用其appendPlainText()方法在窗口小部件中放入一些诊断信息。

当然我的第一次破解有同步问题,所以我创建了一个包含QPlainEdit的类,用一个互斥来同步事物。基本上就是这样:

class synced_output {
public:
    std::mutex mutex;
    QPlainTextEdit & text;

    synced_output (QPlainTextEdit * text_output) : text(*text_output) {}
    void put_line (const std::string & line) {
        std::lock_guard<std::mutex> lock(mutex);

        text.appendPlainText(line.c_str());
    }
private:
    synced_output operator= (synced_output &){}
};

这似乎很好地解决了比赛状况。但是,在我以某种方式与窗口进行交互(仅点击它就足够了)之前,PlainTextEdit小部件的内容不会明显更新。如果它添加了足够的文本,我可以看到滚动条出现并移动,但在我点击之前没有文字。

根据我在网上看到的一些建议,我尝试在其中放置text.repaint(),但这只会导致崩溃抱怨“无法将事件发送到不同线程拥有的对象”。我认为这是有道理的,但我仍然需要这样做。那么如何才能在更改后正确显示?是否有其他更好的习惯用于处理QT调用以从多个OS线程更改小部件内容?

0 个答案:

没有答案