访问冲突将QString传递给插槽

时间:2016-01-09 14:27:36

标签: c++ multithreading qt

这类似于我昨天发布的question,但我能够进一步隔离问题所以我宁愿问一个新问题。

我有一个发送信号的QThread并将QString传递给一个插槽。 这就是我连接信号和插槽的方式:

connect(reader, SIGNAL(error(QString)), this, SLOT(threadError(QString)))

这是信号的发射方式:

void Reader::read() {
    emit error("No new data for 500 samples");
    while (1) {
    }
}

这是插槽实现:

void MainWindow::threadError(const QString msg) {
    std::string st = msg.toStdString();
    int i = 0; //never reached
}

即使线程继续运行,访问msg QString也会导致访问冲突异常。我看了很多例子,我找不到另一种方法。我究竟做错了什么?

更新: 声明:

class Reader : public QObject {
    Q_OBJECT

public:
    Reader();
    ~Reader();

    public slots:
    void read();

signals:
    void error(QString err);
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent, const std::string &config_file, const 
    ~MainWindow();

    private slots:
    void threadError(QString msg);
}

3 个答案:

答案 0 :(得分:0)

我没有看到您的代码存在明显问题。如果您在代码中使用C ++ 11和旧的Qt库,则可以尝试升级到Qt 4.8.7或Qt 5.x.

答案 1 :(得分:0)

线程之间的信号槽连接排队,默认情况下不直接。我认为因为while(1){}这个问题即将来临。尝试在无限循环内进行睡眠,以便处理事件循环。

答案 2 :(得分:-1)

尝试进行此更改。连接:

connect(reader, SIGNAL(error(QString*)), this, SLOT(threadError(QString*)));

发出信号:

emit error(new QString("No new data for 500 samples"));

插槽:

void MainWindow::threadError(QString* msg) {
    std::string st = msg->toStdString();
    delete msg;
    int i = 0;
    .........
}