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