如何在Qt中将访问时间限制为一种方法
How to limit visit times to a method in Qt?
有一个信号--sendMessage(),它会触发一个函数--handleMessage(),如果我在一个拍摄时间内得到信号的次数太多,就会出现一些问题,所以我要设置handleMessage()只能每500毫秒运行一次。
一些朋友可以告诉我如何实现它吗?
我这样做的方法是使成员变量bool mMessageSendPending;
接下来,我将创建一个成员变量QTimer mTimer;
在构造函数中,我会像这样设置计时器:
// Run lambda function on timer timeout
connect(&mTimer, &QTimer::timeout, [=](){
// This code will be run by timer
if(mMessageSendPending){
// This will never happen more frequent than 500ms
handleMessage();
// Reset to be ready for next send
mMessageSendPending=false;
}
});
// Start timer with interval of 500 ms
mTimer.start(500);
// Run lambda function on sendMessage received
connect(&mySender, &MySenderClass::sendMessage, [=](){
// Mark that we want to handle message.
// This may happen more frequent than once every 500ms
mMessageSendPending=true;
});
编辑:正如@Trevir指出的那样,这在线程边界上是不安全的。为了安全起见,建议将所有对mMessageSendPending
的访问包装在具有匹配QMutex
的QMutexLocker
中,或者将QAtomicInteger
包装以创建"原子布尔值"。
处理此问题的常用方法是延迟手动处理消息,例如照常连接
connect(sender, &Sender::sendMessage, receiver, &Receiver::handleMessage);
并在接收端收集消息,使用计时器延迟
class Receiver : public QObject
{
Q_OBJECT
public:
void handleMessage(const QString &message);
....
private:
QStringList m_messages;
....
};
static const int DELAY = 500;
void Receiver::handleMessage(const QString &message)
{
const bool needsScheduling = m_messages.isEmpty();
m_messages.append(message);
if (needsScheduling) {
// schedule handling messages after a delay
// calls of handleMessage until this fires will add more messages
// to m_messages
QTimer::singleShot(DELAY, this, [this]() {
// do whatever you need to do with the messages
qDebug() << m_messages;
// clean up
m_messages.clear();
});
}
}
QML中的另一种解决方案:
Timer {
id: timer
property real period: 1000
property real started: 0
interval: 10
running: true
repeat: true
onTriggered: {
var s = new Date().getTime();
if((s - timer.started) > timer.period)
{
timer.started = s;
handleMessage();
}
}
function handleMessage()
{
console.log("handleMessage");
}
}
handleMessage()
调用频率不超过 1000 毫秒,尽管onTriggered()
每 10 毫秒调用一次。
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 寻找一种更好的方法来表示无符号字符数组
- 有没有一种通用的方法来实现不变量
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 一种从内存中删除 UTF 字节的方法?