有没有办法调试排队等候对象的Qt槽调用?

时间:2018-04-10 12:25:42

标签: c++ multithreading qt signals-slots

一个对象存在于一个线程中并有一些插槽,用

调用
Qt::QueuedConnection 

Qt::BlockingQueuedConnection

有没有办法知道队列中有多少slot calls?或者甚至知道number of each slot calls中的queue

2 个答案:

答案 0 :(得分:0)

也许有点offtopic,但下一个模式可能会帮助你(当你每次操作只需要一个插槽时)。例如,当您有大量不可预测的数据更改并且需要更新视图时。

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 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

有待改进。您可以使用非零超时调用_timer->start( 100 );以获得更好的延迟,但您需要以某种方式强制定期发出信号。它会使代码更复杂,如果您需要帮助,请写下评论。

答案 1 :(得分:0)

有关详细信息,请参阅this question。您需要监控(通过过滤器)<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.5.2/c3.js"></script> <link rel="stylesheet" type="text/css" href="https://rawgit.com/masayuki0812/c3/master/c3.css"> <div id="chart"></div>事件。