C++ 是否有方法调试排队等待对象的Qt插槽调用?
对象存在于线程中并具有一些插槽,这些插槽用C++ 是否有方法调试排队等待对象的Qt插槽调用?,c++,multithreading,qt,signals-slots,C++,Multithreading,Qt,Signals Slots,对象存在于线程中并具有一些插槽,这些插槽用 Qt::QueuedConnection 或 有没有办法知道队列中有多少插槽调用?甚至可以知道队列中每个插槽调用的数量?可能有点离题,但下一个模式可能会帮助您(当您每次操作只需要一个插槽调用时)。例如,当您有大量不可预测的数据更改,并且需要更新视图时 class SlotProxy : public QObject { Q_OBJECT signals: void triggered(); public: explicit Slot
Qt::QueuedConnection
或
有没有办法知道队列中有多少
插槽调用
?甚至可以知道队列中每个插槽调用的数量
?可能有点离题,但下一个模式可能会帮助您(当您每次操作只需要一个插槽调用时)。例如,当您有大量不可预测的数据更改,并且需要更新视图时
class SlotProxy : public QObject
{
Q_OBJECT
signals:
void triggered();
public:
explicit SlotProxy( QObject *parent = nullptr );
void trigger();
private:
void onTimeout();
private:
QPointer<QTimer> _timer;
};
SlotProxy::SlotProxy( QObject *parent = nullptr )
: _timer{ new QTimer{ this } }
{
_timer->setInterval( 0 );
_timer->setSingleShot( true );
connect( _timer, &QTimer::timeout, this, &SlotProxy::onTimeout );
}
void SlotProxy::trigger()
{
_timer->start( 0 ); // May be not zero;
}
void SlotProxy::onTimeout()
{
emit triggered();
}
class SlotProxy:公共QObject
{
Q_对象
信号:
无效触发();
公众:
显式SlotProxy(QObject*parent=nullptr);
无效触发器();
私人:
void onTimeout();
私人:
指针计时器;
};
SlotProxy::SlotProxy(QObject*parent=nullptr)
:_timer{new QTimer{this}
{
_定时器->设置间隔(0);
_定时器->设置单脉冲(真);
连接(_timer,&QTimer::timeout,this,&SlotProxy::onTimeout);
}
void SlotProxy::trigger()
{
_计时器->开始(0);//可能不是零;
}
void SlotProxy::onTimeout()
{
发射触发();
}
用法:
class MyForm : public QWidget
{
/*...*/
void updateGui();
};
class Worker : public QObject
{
/*...*/
signals:
void updateRequest();
public:
explicit Worker( QObject *parent = nullptr );
private:
void heavyTask();
private:
SlotProxy _proxy;
};
Worker::Worker( QObject *parent )
: QObject{ parent }
{
connect( _proxy, &SlotProxy::triggered, this, &Worker::updateRequest );
}
void Worker::heavyTask()
{
for ( auto i = 0; i < 1000; i++ )
{
/*...*/
_proxy.trigger();
}
}
MyForm form;
Worker worker;
QObject::connect( &worker, &Worker::updateRequest, &form, &MyForm::updateGui );
worker.heavyTask();
// here you will have only 1 slot MyForm::updateGui in queue
classmyform:publicqwidget
{
/*...*/
void updateGui();
};
班级工作人员:公共QObject
{
/*...*/
信号:
void updateRequest();
公众:
显式工作者(QObject*parent=nullptr);
私人:
无效重任务();
私人:
SlotProxy_代理;
};
工作者::工作者(QObject*父)
:QObject{parent}
{
连接(_proxy,&SlotProxy::triggered,this,&Worker::updateRequest);
}
void Worker::heavyTask()
{
用于(自动i=0;i<1000;i++)
{
/*...*/
_proxy.trigger();
}
}
我的形式;
工人;
QObject::connect(&worker,&worker::updateRequest,&form,&MyForm::updateGui);
worker.heavyTask();
//在这里,队列中只有1个插槽MyForm::updateGui
有待改进。您可以调用
\u timer->start(100)代码>具有非零超时以获得更好的延迟,但您需要以某种方式强制定期发出信号。它将编写一个更复杂的代码,如果需要帮助,请写一条评论。有关详细信息,请参阅。您需要(通过过滤器)监视QMetaCallEvent
事件。我只需使用插槽中的调试输出(无论是qDebug()
还是printf
)来打印每个调用,而不是分析日志。您的意思是获取事件队列中当前排队的插槽调用事件数吗?你为什么要知道?你想解决的实际问题是什么?现在听起来有点像。@vahancho这个线程用于声音流/接收,所以很多qDebug/printf肯定会把时间搞砸。可能是
class MyForm : public QWidget
{
/*...*/
void updateGui();
};
class Worker : public QObject
{
/*...*/
signals:
void updateRequest();
public:
explicit Worker( QObject *parent = nullptr );
private:
void heavyTask();
private:
SlotProxy _proxy;
};
Worker::Worker( QObject *parent )
: QObject{ parent }
{
connect( _proxy, &SlotProxy::triggered, this, &Worker::updateRequest );
}
void Worker::heavyTask()
{
for ( auto i = 0; i < 1000; i++ )
{
/*...*/
_proxy.trigger();
}
}
MyForm form;
Worker worker;
QObject::connect( &worker, &Worker::updateRequest, &form, &MyForm::updateGui );
worker.heavyTask();
// here you will have only 1 slot MyForm::updateGui in queue