C++ 将QString传递到插槽的访问冲突
这与我昨天发布的一个类似,但我能够进一步隔离问题,所以我宁愿问一个新问题 我有一个QThread,它发出信号并将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
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;
.........
}