这类似于我昨天发布的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);
}
答案 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;
.........
}