Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将QString传递到插槽的访问冲突_C++_Multithreading_Qt - Fatal编程技术网

C++ 将QString传递到插槽的访问冲突

C++ 将QString传递到插槽的访问冲突,c++,multithreading,qt,C++,Multithreading,Qt,这与我昨天发布的一个类似,但我能够进一步隔离问题,所以我宁愿问一个新问题 我有一个QThread,它发出信号并将QString传递给插槽。 这是我连接信号和插槽的方式: connect(reader, SIGNAL(error(QString)), this, SLOT(threadError(QString))) 这就是信号的发射方式: void Reader::read() { emit error("No new data for 500 samples"); while

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

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

尝试进行此更改。连接:

connect(reader, SIGNAL(error(QString*)), this, SLOT(threadError(QString*)));
发射信号:

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


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

线程之间的信号插槽连接是排队的,默认情况下不是直接的。我想是因为while(1){}这个问题来了。请尝试在无限循环中进行休眠,以便事件循环得到处理。

const QString msg
您的意思是
const QString&msg
?@Ilya否。我应该通过引用传递QString吗?我会通过值传递它,只是
QString msg
您的
错误信号是如何定义的?Qt 4.8.1已经过时(4年了?),从4.8.1到4.8.7有很多bug修复,是您自己构建的,还是预构建的?谢谢您的回复。不幸的是,同样的问题也出现了。然后在插槽的开头添加断点,然后查看
msg
this
。当插槽启动时,您的对象可能被删除。啊,我看了看您的第二个问题,发现您使用了
try…catch
。千万不要对Qt这样做。试着发出你的信号而不去捕捉,看看会发生什么。是的,这就是我现在正在做的。这就是我发布另一个问题的原因。昨天我认为这与try-catch和删除线程有关。但是今天我在它之外尝试了它,同样的错误也发生了。谢谢你一直在看它。你能给我指出一个源的方向吗?这解释了为什么我不应该使用try-catch和emit?否则,我将如何知道何时抛出异常?
void MainWindow::threadError(QString* msg) {
    std::string st = msg->toStdString();
    delete msg;
    int i = 0;
    .........
}