gpt4 book ai didi

c++ - QTimer::singleShot(0, object SLOT(obj_slot())) 是做什么的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:55 25 4
gpt4 key购买 nike

我是学习 Qt 的初学者,并试图理解提供的 Qt example用于下载操作。在 downloadmanager.cpp ,成员函数如下:

void DownloadManager::append(const QUrl &url)
{
if (downloadQueue.isEmpty())
QTimer::singleShot(0, this, SLOT(startNextDownload()));

downloadQueue.enqueue(url);
++totalCount;
}
  • 我很困惑,为什么如果 downloadQueue 为空,则需要在添加 url 之前激活 startNextDownload()(注意:如果 downloadQueue 为空,则 startNextDownload() 结束程序)
  • 我不确定为什么:QTimer::signleShot(x, y, z) 已被使用。据我了解,它是一个计时器,它以 0 毫秒的延迟激活插槽。
  • 我无法通过查看 Qt Assistant 来弄清楚 singleShot 是一次性设置以在给定的毫秒间隔重复激活插槽还是一次性

澄清:

我是初学者,例如:

statement1;
statement2;

我习惯于看到 statement1 在继续处理 statement2 之前运行和完成。但是尝试学习 Qt 并阅读给定的示例,我看到 SLOT(startNextDownload())downloadQueue.enqueue(url); 发生后被激活。我试图理解为什么这样做有效。

最佳答案

这会在消息队列中排队回调。

计时器立即结束,一条消息被发布到消息队列中。当进程进入下一次主循环时,startNextDownload() 函数被调用。此时,该 URL 已在队列中。

startNextDownload() 函数从调度上下文调用,可以安全地更改窗口内容。这样,DownloadManager 类就可以在多线程应用程序中使用,其中启动下载的线程可能与 Paint 事件的处理程序同时运行。通过从处理 Paint 事件的同一线程调用它,您可以确保没有处理此类事件,并且您可以安全地更新小部件。

如果之后需要重新绘制一个小部件,它会请求重新绘制,如果该小部件当前可见,操作系统将发送一个Paint 事件。

关于c++ - QTimer::singleShot(0, object SLOT(obj_slot())) 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41524265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com