当我试图从另一个线程发射信号时,它会导致段错误,不确定原因。
信号和槽都在同一个类中定义,并在主GUI线程下运行,但我在由boost线程类型控制的另一个函数中调用了emit。
我正在使用Qt4,Ubuntu 10.04是我的操作系统。
这个函数是从发射信号的另一个线程中调用的。
这是Qt类的构造函数。
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);
}
invokeMethod
以及它连接到的slot
)。 - tmpearceQApplication::exec()
)?2)当您调用MyMapItem
对象时,它们是何时创建的?您确定在调用时它们是有效的项目吗? - tmpearceMapGenerator
从哪里获取指向MyMapItem
的指针/引用?我猜测您现在正在调用未初始化指针的成员函数,这可能是因为该项尚未构建,或者在构建该项后您忘记正确设置指针/引用。 - tmpearceMapGenerator
构造函数中初始化它以来,它实际上发出了信号。现在问题是,在连接的槽中,我正在调用update()来刷新该项。所以它没有调用update()。我无法理解其原因。 - TopGun