我正在开发一个应用程序,该应用程序处理包含项目详细信息的文本(以制表符分隔的形式)文件(可能很大,达到一两百万行),并且由于处理时间可能很长,我想更新一个进度条,以便用户知道应用程序不只是挂起,或者更好地提供剩余时间的概念。
我已经研究过,我知道如何更新一个简单的进度条,但是这些示例往往过于简单化,因为使用 Timer 调用诸如 progressBar.setProgress(counter++, 100) 之类的东西,还有其他示例逻辑很简单并且用同一个班级。我也是该语言的新手,过去主要使用 Java 和一些 JavaScript,等等。
我编写了处理文件的逻辑(验证输入和创建输出文件)。但是,如果我在主类中调用处理逻辑,则更新将在处理结束时完成(从 0 飞到 100 如此之快),无论我是否更新变量并尝试调度事件或类似的事情;该栏不会反映处理进度。
按块处理输入是一种有效的方法吗?然后,我不确定一个数据块的处理延迟是否会影响下一个块的处理等等,因为计时器滴答设置为1毫秒,块处理时间会比那个长. 此外,如果输入的顺序不会受到影响,或者结果会以某种方式损坏。我读过该语言不支持多线程,所以这应该是一个问题吗?
我已经编写了之前描述的逻辑,它似乎工作:
// called by mouse click event
function processInput():void {
timer = new Timer(1);
timer.addEventListener(TimerEvent.TIMER, processChunk);
timer.start();
}
function processChunk(event:TimerEvent):void {
// code to calculate start and end index for the data chunk,
// everytime processChunk is executed these indexes are updated
var dataChunk:Array = wholeInputArray.splice(index0, index1);
processorObj.processChunk(dataChunk)
progressBar.setProgress(index0, wholeInputArray.length);
progressBar.label = index0 + " processed items";
if(no more data to process) { // if wholeInputArray.length == index1
timer.stop();
progressBar.setProgress(wholeInputArray.length, wholeInputArray.length);
progressBar.label = "Processing done";
// do post processing here: show results, etc.
}
}
进度条的声明如下:
<mx:ProgressBar id="progressBar" x="23" y="357" width="411" direction="right"
labelPlacement="center" mode="manual" indeterminate="false" />
我用 50000 行的输入对其进行了测试,它似乎可以生成与同时处理输入的另一种方法相同的结果。但是,这是一种有效的方法还是有更好的方法?
提前致谢。