一个对象存在于一个线程中并有一些插槽,用
调用Qt::QueuedConnection
或
Qt::BlockingQueuedConnection
有没有办法知道队列中有多少slot calls
?或者甚至知道number of each slot calls
中的queue
?
答案 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>
事件。