当我试图从另一个线程发出信号时,它会导致段错误,不知道为什么。
信号和槽都定义在同一个类中,并在主 GUI 线程下运行,但我在另一个函数中调用发出,该函数由 boost 线程类型的线程控制。
我正在使用 Qt4,而 Ubuntu 10.04 是我的操作系统。这个函数是从另一个发出信号的线程调用的。
void MyMapItem::updateMap(std::vector<int> data11)
{
my_mutex.lock();
cout<< "i am in updatemap"<<endl;
data12.clear();
data12=data11;
cout<<"size of data"<<data12.size()<<endl;
my_mutex.unlock();
emit mera_signal();
}
MyMapItem::MyMapItem(QGraphicsItem *parent )
{
QObject::connect(this,SIGNAL(mera_signal()),this,SLOT(mera_slot()),Qt::BlockingQueuedConnection );
}
以上是我的 Qt 类的构造函数。
void MyMapItem::mera_slot()
{
cout<< "signal is emitted"<<endl;
qDebug() << "Date:";
}
以上是插槽定义,我暂时只是打印一条消息。
让我再详细说明一下我的流程。
- 我有一个
MapGenerator
从QThread
现在继承的类,它连接到 ROS 并订阅一个主题。 - 现在我得到了另一个
MyMapitem
继承自QObject
两者GraphicsItem
的类,在这个类中我定义了一个插槽和一个信号。 - 现在我得到了第三个类
Mainwindow
,它继承自Qobject
并为我设置了图形场景mymapitem
。 - 现在我要做的
main
是创建对象Mapgenerator
并启动线程。 - 然后我做一个对象
Mainwindow
。 - 因此,当
Mapgenerator
线程启动时,它会从 ROS 订阅数据并调用一个函数MyMapItem
并在那里传输数据。
在这里,我想发出一个信号,这样我就知道新数据到达了。然后我在构造函数中更新场景中已经存在的Mainwindow
项目。连接是在MyMapItem
类构造函数中建立的。
谢谢在这里,我发布了我创建线程和主窗口的主要方法。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ros::init(argc,argv,"last");
MapGenerator::MapGenerator mg(argc,argv);
//boost::thread ros_thread(boost::bind(&MapGenerator::init2, &mg));
mg.start(); // Qthread
MainWindow w(argc,argv);
w.show();
return a.exec();
}
在主窗口构造函数中,我创建了 Mapitem 对象
MainWindow::MainWindow( int argc, char **argv, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("My app");
mapitem = new MyMapItem();
scene = new QGraphicsScene(0,0,4000,4000);
ui->graphicsView->setScene(scene);
scene->addItem(mapitem);
}