在每次循环迭代时停止代码执行毫秒
Stopping code execution for milliseconds at each iteration of loop
我在循环中调用一个函数:
for (Item *item : *items) {
item->func();
}
被调用的函数发出信号并等待 100 毫秒:
void Item::func()
{
// Emit a signal
emit castSignal();
QTimer::singleShot(100 /* msec */, [](){
qDebug() << "Wait for 100 milliseconds";
});
}
我有一个插槽,当收到信号时记录到控制台:
QObject::connect(this, &Item::castSignal, this, &Item::handleSignal);
void Item::handleSignal()
{
qDebug() << "Signal received";
}
我希望日志是这样的:
Signal received
Wait for 100 milliseconds
Signal received
Wait for 100 milliseconds
Signal received
Wait for 100 milliseconds
但实际日志是这样的:
Signal received
Signal received
Signal received
Wait for 100 milliseconds
Wait for 100 milliseconds
Wait for 100 milliseconds
我想不通为什么!谁能帮忙。
singleShot
添加一个计时器,然后继续执行。 时间间隔过后,将调用您的 lambda。 因此,您启动了三个计时器,并且在第一个计时器的超时时间过去之前接收到所有三个信号。
如果您确实需要等待 100 毫秒func
请使用睡眠功能。
让我们一步一步地分析你的代码:
for (Item *item : *items) {
item->func();
}
相当于:
emit castSignal();
QTimer::singleShot(100 /* msec */, [](){
qDebug() << "Wait for 100 milliseconds";
});
emit castSignal();
QTimer::singleShot(100 /* msec */, [](){
qDebug() << "Wait for 100 milliseconds";
});
emit castSignal();
QTimer::singleShot(100 /* msec */, [](){
qDebug() << "Wait for 100 milliseconds";
});
// ...
必须考虑以下几点:
在您的情况下,接收方和发送方开始相同的线程,因此由于默认情况下使用 Qt::AutoConnection ,因此会立即调用该插槽。
定时器在同步部分结束时和指定时间启动
考虑到上述情况,看到handleSignal消耗的时间非常少,您的代码相当于:
qDebug() << "Signal received";
qDebug() << "Signal received";
qDebug() << "Signal received";
T: 100 ms
qDebug() << "Wait for 100 milliseconds";
qDebug() << "Wait for 100 milliseconds";
qDebug() << "Wait for 100 milliseconds";
获得您得到的行为。
@1201ProgramAlarm所指示的也是如此,但使用睡眠是一个糟糕的选择,因为它会阻塞事件循环,阻止其他信号、事件等正常运行,相反,一个可能的选择是使用 QEventLoop:
void Item::func()
{
// Emit a signal
emit castSignal();
QEventLoop loop;
QTimer::singleShot(100 /* msec */, [&loop](){
qDebug() << "Wait for 100 milliseconds";
loop.quit();
});
loop.exec();
}
相关文章:
- 以下代码执行哪种内存分配(动态或静态)?
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 使用 execv 从C++代码执行的 Linux 脚本失败
- 由于找不到cpprest_2_10.dll,代码执行无法继续
- 在每次循环迭代时停止代码执行毫秒
- 与Java相比,为什么此C 代码执行速度如此慢
- 记录组件代码执行
- 相同的代码执行两次:性能差异
- 代码执行/CPU 速度每 2 秒减慢一次
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 如何将字符串从C++DLL返回到MetaTrader 4代码执行生态系统?
- 当我从java代码执行C++时不显示任何输出
- C++和共享库中的代码执行点
- 递归期间代码执行中断
- 为可选的评测代码执行进行高效设计
- 我正在尝试使用 ifstream 将此 C 函数的等效代码执行到 c++ 中
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 如何在iOS应用程序中锁定代码执行
- 中断代码执行
- 是否有一个工具来记录代码执行