在进度监控和更新进度条的上下文中

     2023-02-17     148

关键词:

【中文标题】在进度监控和更新进度条的上下文中【英文标题】:In the context of progress monitoring and updating a progress bar 【发布时间】:2021-09-15 14:47:09 【问题描述】:

。可以启动一个计时器并每隔几秒钟更新一次进度条。我们测量完成任务所需的时间并硬编码所需的秒数。它有点工作,除非即完成任务所需的时间不是恒定的。此外,如果任务的实现发生变化,变得更慢/更快,那么任务可能会在任务栏打开时完成,即 10%,这看起来不太好。

如果时间不是恒定的,还有另一种方法。让我们对doSomething 说,我们跨越了几个航路点,在这些航路点上我们发出信号来报告进度。 我们传入航点的总数(即 3 个),并在每个航点上计算比率。

但是,如果我们添加/删除航点,我们必须调整调用,而不是 doSomething(3),它可能是 doSomething(5)。除非我们找到一种在编译时自动更新int total = 3 的方法,否则这可能吗?也许预处理器宏?我可以计算在编译时我调用process() 的次数吗?

小部件.h

class Widget : public QWidget

    Q_OBJECT

    Task m_task;

public:
    Widget(QWidget *parent = nullptr)
    
        connect(&m_task, &Task::status, this, &Widget::showProgrss);
    
        int total = 3;
        m_task.doSomething(total);
    

public slots:
    void showProgrss(float p)
    
        qDebug() << " - progress" << p;
    
;

任务.h

class Task : public QObject

    Q_OBJECT

    float m_total= 0;
    int count = 0;

public:
    explicit Task(QObject *parent = nullptr)

    void doSomething(int t)
    
        m_total = t;
        progress();
        func1();
        progress();
        func2();
        progress();
    

private:
    void progress()
    
        float p = (++count/m_total)*100;
        emit status(p);
    

    void func1()
    
//        progress();
    

    void func2()
    
//        progress();
    

signals:
    void status(float p);
;

上面的输出是:

 - progress 33.3333
 - progress 66.6667
 - progress 100

但如果我们取消注释其中一个对progress() 的调用,它会输出:

 - progress 33.3333
 - progress 66.6667
 - progress 100
 - progress 133.333

这是我想要避免的。

【问题讨论】:

您的问题似乎有点开放式。您希望我们回答的具体内容是什么?听起来您的问题是:“计算进度的最佳方法是什么?”人们可能会提出不同的想法,但有没有事实上正确的方法? 哦,不是这样的。是否可以在编译时计算函数(progress())被调用的次数?然后自动更新int total = 3;? 一个好的做法是根据领域问题固有的一些数量来定义进度。示例:与文件大小相比传输的字节数。如果它只能通过所采取的一些行动来衡量,或许可以定义一个描述具体行动类型的枚举类,并强制每个调用者识别刚刚采取的行动。这使得它更难搞砸,如果你这样做的话,退化也不会那么严重。 【参考方案1】:

我的建议是改变你的方法。不要试图计算函数调用。相反,以隐式计算总数的方式构建您的进度步骤。就像将它们存储在向量中一样。

std::vector<std::function<void()>> m_steps 
    step1,
    step2,
    step3


void doSomething() 

    for (auto &f : m_steps) 
        f();
        progress();
    


void progress()

    float p = (++count/m_steps.size())*100;
    emit status(p);

【讨论】:

有趣。然而,这可能会导致一些严重的重构,因为这里的代码分布在一系列类中。 我喜欢在数据结构中明确包含函数 (lambda) 作为问题解决模型的一部分。步骤执行与进度计算紧密结合。

mfc编写一个flash播放器slider进度条的程序,在新建线程中,怎么实现进度条的更新

...当前帧数,然后除以总帧数,乘以一个比例1000,即slider进度条的最大范围,然后得slider上面的位置,用SetPos得到当前的位置。然后Sleep()延迟一段时间,就这样不断循环。while(pInfo->pFlash->IsPlaying())intnpos=(pInfo->pFlash->Cur... 查看详情

在每个 TableViewcell 中播放带有进度条的音频

】在每个TableViewcell中播放带有进度条的音频【英文标题】:PlayingaudiowithprogressbarineachTableViewcell【发布时间】:2013-06-2410:04:38【问题描述】:有一个UITableView,我在我的每个单元格中放置了一个音频按钮,点击该按钮有一个进度... 查看详情

如何在service中同步更新通知activity中的进度条

...做一个下载功能,需要在service中同步更新notification中的进度条和某一个activity中的进度条,notification中显示所有下载项的下载进度,单击某一下载进度条,启动本下载项目的详细下载界面,包含当前下载项的下载进度条和下载控... 查看详情

如何更新引导进度条。

】如何更新引导进度条。【英文标题】:Howtoupdatebootstrapprogressbar.【发布时间】:2016-11-2216:23:07【问题描述】:关于引导进度条的文档说明了如何显示具有默认值和完成值的进度条,但现在如何更新它?那么,更新值和宽度的最... 查看详情

带有图像和圆形进度条的圆形按钮

】带有图像和圆形进度条的圆形按钮【英文标题】:Circularbuttonwithimageandcircularprogressbar【发布时间】:2019-12-2819:29:53【问题描述】:我正在尝试制作一个按钮,里面有一个图像,外面有一个圆形进度条,按下按钮后是彩色的。我... 查看详情

vc6.0里mfc进度条如何使用

参考技术A演练CProgress7.1进度条的主要功能进度条控制(ProgressControl)主要用来进行数据读写、文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动... 查看详情

从 oraclebulkcopy 获取进度条的运行时

】从oraclebulkcopy获取进度条的运行时【英文标题】:getruntimefromoraclebulkcopyforprogressbar【发布时间】:2021-09-2908:53:30【问题描述】:朋友们晚安,我正在上传一个文件从重型excel(200MB)到oracle,我正在使用BackgroundWorker1在后台处理它... 查看详情

在 Xamarin Forms 中下载带有进度条的文件

】在XamarinForms中下载带有进度条的文件【英文标题】:DownloadfilewithprogressbarinXamarinForms【发布时间】:2015-08-1813:32:33【问题描述】:我正在尝试使用下载进度条在XamarinForms(PCL,因此WebClient不可用)中创建一个下载页面。我使用... 查看详情

如何循环更新进度条?

】如何循环更新进度条?【英文标题】:Howtoupdateaprogressbarinaloop?【发布时间】:2016-07-3017:09:03【问题描述】:循环更新Tkinter进度条的简单方法是什么?我需要一个没有太多混乱的解决方案,所以我可以在我的脚本中轻松实现它... 查看详情

Inno Setup - 在自定义页面上复制带有进度条的文件

】InnoSetup-在自定义页面上复制带有进度条的文件【英文标题】:InnoSetup-CopyFileswithProgressBaronacustompage【发布时间】:2020-09-2915:38:43【问题描述】:我目前正在开发一个更新我们公司软件的程序。我让用户在“CreateInputDirPage”中选... 查看详情

带有进度条的 Firebase 数据库

】带有进度条的Firebase数据库【英文标题】:Firebasedatabasewithprogressbar【发布时间】:2018-01-2706:05:45【问题描述】:我有问题。从Firebase数据库加载数据时,我无法将progressbar附加到我的活动中。我尝试通过Asynctask附加进度条,将fi... 查看详情

pyqt5之进度条:qprogressbar(代码片段)

PyQt5之进度条:QProgressBar在软件中,在处理特别冗长的任务时,如果没有相关的进度信息,这个等待的过程会比较考验用户的耐心,根据相关理论,进度条可以缓解用户在等待过程中的焦虑,所以,... 查看详情

在进度条的开始和停止时大声朗读(md-progress-linear)

】在进度条的开始和停止时大声朗读(md-progress-linear)【英文标题】:Readaloudatstartandstopofprogressbar(md-progress-linear)【发布时间】:2018-11-2221:02:21【问题描述】:当出现带有进度条的对话框时,我需要使用NVDA屏幕阅读器来阅读一些... 查看详情

android中progressdialog进度条对话框的使用(使用子线程模拟更新进度)

...ogressDialog可以实现多种样式,今天我们就来实现模拟水平进度条更新的效果。具体实现:布局页面一个按钮就不再说明。下面来看在Activity代码中的实现:publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListenerprivateintiPos=0;//... 查看详情

如何在 wpf 中制作多色分段进度条?

】如何在wpf中制作多色分段进度条?【英文标题】:HowcanImakeamulti-coloredsegmentedprogressbarinwpf?【发布时间】:2015-11-1306:43:19【问题描述】:我正在尝试创建一个用作分段进度条的UserControl。输入是对象的集合,每个对象都有一个类... 查看详情

如何更改进度条的位置 - 多处理

】如何更改进度条的位置-多处理【英文标题】:Howtochangepositionofprogressbar–multiprocessing【发布时间】:2017-07-1700:20:56【问题描述】:首先,我是Python新手。与问题无关,但我不得不提一下。我正在创建一个爬虫作为我的第一个项... 查看详情

delphixeandroid更改progressbar1进度条颜色

下面是安卓学习手册中实现各种进度条的截图:要想看各种进度条的实现代码和文档,直接去360手机助手中下载安卓学习手册,例子文档随便看。1、说明  在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有... 查看详情

带有进度条的按钮 android

】带有进度条的按钮android【英文标题】:Buttonwithprogressbarandroid【发布时间】:2021-05-2910:54:36【问题描述】:我正在尝试在Android中创建一个带有进度条的自定义按钮。按钮应该有两种状态:正常和正在加载。在正常状态下它应该... 查看详情