Rob Cozens wrote:


Hi Robert,

If I am running a process of 100 loops and my bar is 200 pixels, then I want to update for each step. However, if my process runs 10000 loops, then updating for each step is pointless since the bar will not visibly move and updating every 50-100 steps will do.


Maybe this is just a morning when I can't get it.

But unless your handler is hard-coded to the specific loop or makes a runtime decision on whether to update every 50 steps, every 100 steps, or some number in between, I see no way the position of the progress bar can accurately reflect the percentage of task completion in all circumstances.

What I posted was generalized logic that calculates the number of steps required to move the progress bar one pixel, regardless of the width of the bar. That is the minimum steps required before resetting the thumbPosition is visually manifested on the screen. Anything more produces "jerkier" movements.

The suggested method sets the scrollbar limits and updates the thumbpos just the same as you do. But it determines whether to do the update based on time elapsed since last update, rather than on a count of the records processed. Because of the way the eye perceives movement and change in a visual scene, this is usually, maybe always, adequate to avoid *visual* jerkiness, even though it can lead to theoretical jerkiness.

Your code (I had to look back to remind myself - so I've copied it here for convenience) was

    put 0 into recordsProcessed
put round(recordCount/(the width of scrollBar "Progress Scrollbar")) into progressInterval
    put max(1,progressInterval) into progressInterval
    repeat with x=4 to lastRecord
      ... -- process one record
      add 1 to recordsProcessed
if (recordsProcessed mod progressInterval)=0 then set the thumbPosition of scrollBar "Progress Scrollbar" to recordsProcessed


For example, let's say we had a scrollbar of 200 pixels, and 1000 records to process. The your code will calculate progressInterval to be 5, and will therefore do 200 updates - very smooth, no jerkiness at all. However, if we actually manage to process these things quickly - say in 2 seconds - then you are doing 100 updates per second.

The other method would replace the last line with something like
        if ticks()-lastTicks > 5 then
set thethumbPosition of scrollBar "Progress Scrollbar" to recordsProcessed
             put ticks() into lastTicks
        end if

So in the above example, it would do 12 updates per second, and hence each update would change the scrollbar position by about 8 pixels. (i.e. some abstract jerkiness)

The screen doesn't actually update 100 times per second, and you certainly can't see this as any smoother than doing 10 or 20 updates per second - so your method is going through the extra CPU cost for no *visible* benefit. (Personally, I don't think the cpu cost of this will be significant, perhaps not even noticeable. The cost of doing "set thumbpos" for *every* record can be significant - but doing it 100 times per second is probably not significant - a quick, unscientific benchmark suggests less than 5% of the cpu of my moderate speed laptop).

OTOH, if the processing would take a long time - say 200 seconds - then the time based method will do additional updates which produce no visible change - i.e. wasted CPU usage - but since it is limited to say 12 times per second, this can be safely assumed to be insignificant percentage of the available CPU.

Summary: there isn't that much to choose between them One can waste a small percentage of the CPU (but only in relatively short-lived loops) while the other can only waste a very small percentage of the CPU (but does so mostly in relatively long-lived loops).

Aside - on WinXP, progress bars do no update to a pixel granularity, they update in blocks of around 12 pixels, so nothing looks all that smooth anyway.

--
Alex Tweedly       http://www.tweedly.net



--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.385 / Virus Database: 268.4.0/304 - Release Date: 07/04/2006

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to