将QString传递到插槽时发生访问冲突

Access Violation passing QString to slot

本文关键字:访问冲突 插槽 QString      更新时间:2023-10-16

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

我有一个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);
}

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

线程之间的信号槽连接是排队的,默认情况下不是直接的。我认为由于while(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;
    .........
}