如何编写使用回调函数的响应式进度条?

     2023-02-16     66

关键词:

【中文标题】如何编写使用回调函数的响应式进度条?【英文标题】:How to code a responsive progress bar that uses callback functions? 【发布时间】:2009-12-08 19:03:05 【问题描述】:

我有这个进度条,它使用来自第三方驱动程序的回调函数,在名为 CFProgress 的窗口中显示传统进度条。

CFProgress *cFM=new CFProgress();
theApp.m_cFM = cFM;
cFM->Create(CFProgress::IDD);
cFM->ShowWindow(SW_SHOW);
thirdpartydriver->set_OnProgress(ProgressFuncC, (void *) cFM);
thirdpartydriver->DoReallyLongTask();

ProgressFuncC如下:

void _stdcall ProgressFuncC(CallbackDataType UserData, LongWord Operation, LongWord Progress, LongWord Total, Bool CanStop, Bool *Stop)

 char cMsg[100];
 sprintf_s(cMsg, 100, "Task Progress (%d%% completed).", Progress * 100 / Total);
 CFProgress *cFM;
 cFM = theApp.m_cFM;
 cFM->m_Prg1.SetPos(Progress * 100 / Total);
 cFM->m_lblMsg.SetWindowText(cMsg);
 cFM->UpdateWindow();

这在早期的操作系统上运行良好,但 Windows 7 一直抱怨应用程序在显示进度条窗口时没有响应。实际功能不受影响。

有什么好方法可以让它对 Windows 更敏感?

我可以将它添加到ProgressFuncC 代码中并期望它解决问题,还是我只是在这里感到困惑:

MSG msg;
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 

    if (msg.message == WM_QUIT)
    
        ::PostMessage(NULL, WM_QUIT, 0, 0L);
    
    else
    
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    

【问题讨论】:

【参考方案1】:

thirdpartydriver->DoReallyLongTask(); 是否在主 UI 线程上运行?

如果是,那么在您将控制权返回给消息循环之前,您的窗口不会响应。

除非此循环正在运行,否则您的任何窗口都不会响应,并且如果该长任务在主线程上,那么它将阻塞此循环。

while(GetMessage(&Msg, NULL, 0, 0) > 0)

    TranslateMessage(&Msg);
    DispatchMessage(&Msg);

您最好的选择是将您的thirdpartydriver->DoReallyLongTask(); 移动到一个单独的线程中,并让您的回调函数将一条消息放入消息循环中(通过SendMessagePostMessage),然后处理该消息并更新进度条.

【讨论】:

thirdpartydriver->DoReallyLongTask() 确实在主 UI 线程上运行,因为代码中没有多线程。但是把进度条放到单独的线程里不是更简单吗? 它可能更简单,但它不会解决你的问题。要获得响应式 UI,您必须将控制权返回给消息循环。这就是 Windows 的工作原理。 我是多线程新手 - 我在问题中添加了一些代码:“我可以将它添加到 ProgressFuncC 代码中吗……”您认为这可以解决无响应问题吗? 是的,这会有所帮助。让它成为一个while循环而不是if,可能会有多条消息。

用js写一个网页进度条

一、基本思路为了让我们编写的网页进度条满足现有需求,又足够轻便,所以使用原生js写一个构造函数,为了见名知义,可以把该函数命名为”Loading”。该函数接收2个参数,分别为arr、callback。其中arr定义图片数组,callback定... 查看详情

如何使用 Spring 响应式通过增量进度更新逐个处理每个产品?

】如何使用Spring响应式通过增量进度更新逐个处理每个产品?【英文标题】:HowtoprocesseachproductonebyonewithincrementalprogressupdateusingSpringreactive?【发布时间】:2019-11-0404:38:33【问题描述】:我需要有关SpringReactive的帮助,其中休息调... 查看详情

text响应式多步进度条(代码片段)

查看详情

响应式文件管理器回调函数输入字段文本

】响应式文件管理器回调函数输入字段文本【英文标题】:Responsivefilemanagercallbackfunctioninputfieldtext【发布时间】:2020-03-0907:43:34【问题描述】:我正在尝试将从响应式文件管理器中选择的值添加到输入文本字段,但是一旦我选择... 查看详情

如何从 java 读取 ffmpeg 响应并使用它来创建进度条?

】如何从java读取ffmpeg响应并使用它来创建进度条?【英文标题】:Howtoreadffmpegresponsefromjavaanduseittocreateaprogressbar?【发布时间】:2012-06-1106:22:50【问题描述】:我正在为java中的ffmpeg创建一个进度条。所以为此我需要执行一个命令... 查看详情

如何使用界面更新异步任务中的进度条

】如何使用界面更新异步任务中的进度条【英文标题】:HowtoupdatetheProgressBarinAsyncTaskwithinterface【发布时间】:2017-11-2616:18:16【问题描述】:我创建了一个应用程序,其中我使用了Fragment类和另一个Async类来下载两个不同的类现在... 查看详情

使用volley时如何保持进度条状态?

】使用volley时如何保持进度条状态?【英文标题】:Howtomaintainprogressbarstatewhenusingvolley?【发布时间】:2014-01-0808:03:15【问题描述】:当我使用带有片段回调的AysncTask时,很容易保持进度条状态,但是我应该如何通过volley来实现呢... 查看详情

使用 WCF Duplex 回调更新 JQuery 进度条?

】使用WCFDuplex回调更新JQuery进度条?【英文标题】:UpdateaJQueryprogressbarusingWCFDuplexcallbacks?【发布时间】:2012-06-1721:01:43【问题描述】:我在IIS(.NET4.x)上托管了一个相当简单的WCF双工服务一个特定的服务方法运行时间很长(1-3分钟... 查看详情

在 R 中使用“foreach()”函数时如何创建进度条?

】在R中使用“foreach()”函数时如何创建进度条?【英文标题】:Howdoyoucreateaprogressbarwhenusingthe"foreach()"functioninR?【发布时间】:2011-07-2209:06:24【问题描述】:有一些关于如何在R程序中为循环创建计数器的信息性文章。但... 查看详情

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

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

Delphi:如何使用进度条显示 CreateProcess 的进度?

】Delphi:如何使用进度条显示CreateProcess的进度?【英文标题】:Delphi:HowtouseaprogressbartodisplaytheprogressofaCreateProcess?【发布时间】:2014-08-0818:24:23【问题描述】:我有一个Startandwait函数,它创建一个进程并等待结束。如何创建进度... 查看详情

如何在这些进度条标题之间添加间距?

】如何在这些进度条标题之间添加间距?【英文标题】:HowcanIaddspacingbetweentheseprogressbartitles?【发布时间】:2022-01-1700:41:59【问题描述】:这是一个响应式设计,请确保在您的浏览器上打开切换设备工具栏我正在尝试制作进度条... 查看详情

了解下foundation进度条

...度来显示:我们可以在 ​​<div>​​ 元素中使用 ​​.progress​​ 类来创建进度条,​​. 查看详情

如何使用 WinForms 进度条?

】如何使用WinForms进度条?【英文标题】:HowtouseWinFormsprogressbar?【发布时间】:2012-08-2101:12:22【问题描述】:我想显示在外部库中执行的计算进度。例如,如果我有一些计算方法,并且我想在我的Form类中将其用于100000个值,我... 查看详情

文件上传和进度条

...我想在上传文件时根据读取的文件数量显示进度条。我们如何使用JS和Servlet来实现这一点我知道上传我可以使用apachecommonslib,但如何根据读取的数据显示进度条。我是否应该根据读取的数据量向JS代码发送计数响应,如果可以,... 查看详情

Python 进度条

...题描述】:当我的脚本执行一些可能需要时间的任务时,如何使用进度条?例如,一个函数需要一些时间才能完成并在完成后返回True。如何在函数执行期间显示进度条?请注意,我需要它是实时的,所以我不知道该怎么做。我... 查看详情

函数响应式编程(frp)思想-callback风格

序ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP。FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁,业务像流水一样清晰流畅。函数响应式编程响应式编程思想为体,函数式编程思想为用。&nb... 查看详情

Delphi DLL 和 Delphi EXE 之间的回调功能

...phiEXE【发布时间】:2013-08-2211:18:34【问题描述】:我正在编写一个DelphiDLL。在DelphiDLL中我想实现一个回调函数,这个回调函数应该回调给调用者Delphi程序。回调函数的主要目的是在DLL中会发生某些长时间的操作,但进度报告(通... 查看详情