Why Does ‘1 Second Remaining’ Take So Long? — How Progress Bars and Time Estimates Work

· Updated: · · Windows, Progress bars, Time remaining, UI, Performance

You have been watching “1 second remaining” for 30 seconds. Just as you expect the task to finish, it changes to “2 minutes remaining.”

File copies, application installations, video exports: progress bars are useful, but sometimes they seem to operate in a different world from the clock.

In fact, a progress bar is not a clock. The percentage describes how much work has been completed; the time estimate predicts how long the remaining work might take; completion means the required operations have succeeded. Separating those three ideas changes how you read a task that will not finish at 99%.

This article explains the general mechanisms using Windows API and UI documentation. It does not reverse-engineer the internal algorithm of a particular File Explorer version. The numerical examples and comparison demo use fictional workloads, not measurements of a PC or network connection.

1. First ask: 100% of what?

Imagine reviewing 100 documents. If 99 are short notes and the last is a long contract, “99 documents finished” can be correct without meaning “99% of the time has elapsed.”

A progress indicator also changes meaning depending on its denominator.

Measurement basis What 50% means What that number alone cannot tell you
File count Half the target files have been processed The size or processing time of the remaining files
Data volume Half the target bytes have been processed Future speed or stages beyond transfer
Weighted stages Half the assigned weights have been completed Whether those weights match this run’s actual duration

For example, the progress callback used by the Windows CopyFileEx API receives the total file size and bytes transferred. These describe work, not future seconds. 1

Progress percentage, time remaining, and completionThe diagram separates a ratio calculated from completed work, a time estimate based on an assumed speed, and completion established by successful results.Completed and total workProgress percentageRemaining work and predicted speedEstimated time remainingRequired operations succeedOverall task complete

Figure 1: A ratio, a prediction, and a result are not three names for the same information.

Throughout this article, progress percentage means the fraction of measurable work completed, progress bar means its visual indicator, and estimated time remaining means the predicted duration. Being unable to make a reliable prediction does not erase the progress already measured.

In the diagram a solid line marks a relation that always holds and a dashed line marks a conditional one (the conditions are given per relation on the detail page). The full list of relations (9 in total, with evidence and certainty) and the definitions of the main concepts are collected on the knowledge map detail page (in Japanese). Data: JSON-LD / Turtle

2. How 10 seconds remaining becomes 79 seconds

The simplest estimate uses this equation:

Time remaining ≈ Remaining work ÷ Estimated future processing speed

The difficult part is not division. It is that future speed has not been observed yet. We therefore use past speed to predict it. In a 2004 explanation of copy-time estimates, Microsoft’s Raymond Chen described this difficulty of predicting the future. That article is not a specification of the calculation used in today’s Windows. 2

Consider a fictional 1,000 MiB copy. A MiB is 1,048,576 bytes. Assume that it first runs at a constant 80 MiB/s for 2.5 seconds, then slows to 10 MiB/s for the next second.

Observation Transferred Remaining Speed used for the estimate Time remaining
2.5 seconds after starting 200 MiB 800 MiB 80 MiB/s 800 ÷ 80 = 10 seconds
3.5 seconds after starting 210 MiB 790 MiB 10 MiB/s 790 ÷ 10 = 79 seconds

The task has advanced during that second. Yet the estimated speed for the remaining work has fallen to one-eighth of its previous value, so the predicted duration increases. This example directly uses the speed from the latest observation interval.

Why time remaining can rise while work advancesIf predicted speed falls enough, its effect outweighs the reduction in remaining work and the calculated time remaining increases.10 MiB completed in one secondLess work remainsPredicted speed drops sharplyTime remaining can increase

Figure 2: An increase in estimated time does not mean the operation has gone backward.

The same applies to “1 second remaining.” An amount that would take one second at the previous speed will take longer if the next operation is slower. Observation intervals and rounding also affect the display. However, a number that never changes should not simply be assumed normal: distinguish processing stages, UI updates, and actual stalls as discussed below.

3. Would averaging make the estimate accurate?

Reflect every brief speed change and the estimate jumps up and down. Use only the average since the start, and an initially fast period can keep the estimate optimistic long after a sustained slowdown.

This follows from how observations are combined. Suppose we give equal weight to a previous speed of 80 and a new speed of 10. The predicted speed becomes 45. It changes less abruptly than an estimate based only on the latest value of 10, but if the speed really stays at 10, it remains optimistic for a while. Smoothness and responsiveness to change are different goals.

The trade-off when smoothing speed estimatesGiving recent observations more weight makes the estimate responsive but variable, while giving history more weight makes it smoother but slower to adapt.Speed observationsMore weight on recent dataMore weight on historyResponsive but variableSmooth but slower to adapt

Figure 3: A steady-looking number is not necessarily an accurate prediction.

This is an example for reasoning about estimation, not a description of a particular product. My design recommendation is to avoid forcing a countdown immediately after startup or a stage change. Wait for useful observations, then present an estimate such as “about a minute.” Saying that the estimate is being recalculated can be less misleading than maintaining an unsupported “1 second remaining.”

4. 99 files finished, but only 9.9% of the data

Now consider the unit being counted rather than the speed. There are 100 files: the first 99 are 1 MiB each, and the final file is 901 MiB. The total is 1,000 MiB.

After the first 99 files, the file count gives 99 ÷ 100 = 99%. Data volume gives 99 ÷ 1,000 = 9.9%. Only one file remains, but it contains 90.1% of the data. Both calculations are correct: they measure different things.

When the last file is largeA large final file after 99 small files makes count-based progress differ sharply from byte-based progress.99 small filesAlmost done by file countOne large file remainsMuch of the data remainsDifferent views of one task

Figure 4: 99% by file count does not promise that only 1% of the time remains.

Does that make byte counts sufficient? No. Transferring many small files over SMB repeatedly incurs file-creation and request round-trip overhead. The same total byte count need not take the same time as a single large file. 3

Consequently, “500 MiB remaining” can be an accurate measurement while the time required varies with the contents of those 500 MiB. Showing both files and bytes is useful not because one number is wrong, but because each reveals something the other leaves out.

5. “Preparing” can mean discovering the denominator

A percentage needs a total as its denominator. But asking an application to process an entire folder does not necessarily mean it has already enumerated every file inside it.

Suppose the application believes there are 100 items and processes 80, then discovers another 100. Those same 80 completed items now represent 80/200 instead of 80/100. The display drops from 80% to 40%, but completed work has not vanished. Presenting a provisional total as a definite one created the mismatch with the reader’s expectations.

Displaying progress before the total is knownWhile targets are being discovered, avoid a definite percentage; once the total is known, combine it with completed work to show a ratio.Not yetYesDiscover the targetsIs the total known?Show stage and discovered countShow a percentage

Figure 5: An unknown denominator is different from 0% progress.

Windows provides progress controls for both determinate values and indeterminate activity. 4 For this situation, I recommend displaying something like “Finding items: 1,200 discovered,” then showing a percentage once the total is known. The absence of a countdown is not evidence that nothing is happening.

6. “Transfer 100%” and “everything finished” mark different boundaries

6.1 Another operation may remain at the end

For illustration, divide an application’s work into three stages: transfer, verification, and finalizing the result. If the design requires verification after transfer, the overall task is not finished when the transfer ends. This is an example application design, not a claim that every copy or installation follows these stages.

Transfer completion versus overall completionThis fictional application verifies and finalizes the result after transfer, so transferred bytes alone cannot establish overall success.TransferVerifyFinalize the resultOverall successTransfer 100% ends here

Figure 6: An explicit scope makes it possible to explain why another stage follows 100%.

Rather than holding an overall bar at 99% with “1 second remaining,” it is more coherent to change the status to “Transfer complete; verifying.” Microsoft’s desktop UI guidance also advises against displaying overall completion before the operation has actually finished. 5

6.2 Writes also have more than one boundary

Windows normally uses caching for file writes. Depending on settings and API contracts, writing from the application and committing data to storage involve different boundaries. 6 FlushFileBuffers is an API for sending buffered information for a specified file to the device. 7

A conceptual view of buffered writesWith buffering, an application's accepted write and the later storage-side write should not be treated as the same event.Application writesHeld in a bufferWritten to storage

Figure 7: This is a conceptual diagram of buffered writes, not the completion contract of an individual product.

However, a pause at 99% is not always caused by flushing a cache. Whether the task is verifying, flushing, or waiting for something else must be established from its design or records. Do not infer that it is safe to unplug a USB device or turn off the power merely from a progress number.

7. Has the task stopped, or has only the display stopped?

In a Windows WPF application, the UI thread’s Dispatcher processes UI work. Occupying that thread for a long time delays updates and responses to input. Distinguish the underlying operation from the work that puts its results on screen. 8

The path from processing to the progress displayEven if the operation reports progress, the display cannot reflect it until the UI processes the update.Actual processingReport progressProcess the UI updateUpdate the screenUI thread blocked

Figure 8: A frozen display does not necessarily mean the operation itself is frozen.

Conversely, an animation designed to run independently of the actual work can continue spinning while that work waits. “Moving means healthy; stationary means broken” is not a sufficient distinction.

What to observe What it can tell you What it cannot establish on its own
Changes in completed items, bytes, or stage Reported advancement of the work Whether the entire task will succeed
Log times, targets, and errors What was recorded as happening and where Whether unlogged work has stalled
CPU, disk, and network use of the relevant process Resource use at that moment Healthy progress versus waiting or useless repetition
A prompt in another window Whether user input is required Every possible cause of a stall

I recommend first recording the display and start time, checking for prompts awaiting input, and comparing counts or logs over time. Treat Task Manager readings as supporting evidence. Before considering termination, check the application’s cancellation procedure and what happens to partial output.

.NET cancellation is also cooperative: requesting cancellation does not itself stop the operation immediately; the operation must respond. 9 This is why “canceling” and “canceled” should be separate states. A progress display alone cannot provide a universal number of minutes after which forcing the application to quit becomes safe.

8. Compare three displays of the same operation

Open the progress-bar comparison demo

The demo advances through observations of a fictional workload when you press a button. There is no need to wait, and it does not read, write, or upload files. The first case contains 99 small files and one large file. For each observation, it shows a file-count bar, a transferred-data bar, and the overall task state side by side.

While the final large file is being transferred, the count-based bar remains at 99% even as the data-volume bar grows. When transferred data reaches 100%, the overall state is still “verifying.” Only the next observation marks success. You can see how the same work can look stalled or active solely because of how it is displayed.

How to read the comparison demoA single observation of one fictional operation feeds three displays: file count, transferred data, and overall state.One fictional operationThe same observationFile-count percentageTransferred-data percentageOverall task state

Figure 9: The demo compares three views of one operation, not three different operations.

The second case reproduces the slowdown from section 2 and shows the calculation that turns 10 seconds into 79. It uses the following calculation. This is a deliberately simple educational estimate, not a production implementation of retries, parallel processing, or stage-specific prediction.

function estimateSeconds(remaining, rate) {
  if (!Number.isFinite(remaining) || remaining < 0) return null;
  if (remaining === 0) return 0;
  if (!Number.isFinite(rate) || rate <= 0) return null;
  const seconds = remaining / rate;
  return Number.isFinite(seconds) ? seconds : null;
}

Use matching units for remaining and rate, such as MiB and MiB/s. A return value of zero means none of the measured workload remains, not that the entire application task has succeeded. For positive remaining work, a zero or unknown speed produces null so that an unknown estimate is not mistaken for “0 seconds remaining.”

9. Aim to avoid misleading users, not merely to look precise

For the design discussed here, I would keep the current stage, measured work, a time estimate only when justified, and the success, failure, or cancellation result separate. Even when combining stage percentages into one bar, a split such as “transfer 80%, verification 20%” represents design weights, not a guarantee of this run’s time allocation.

Building a progress display from observationsShow the current stage, measured quantities, a time estimate when justified, and the final result as separate information.Information from the operationCurrent stageMeasured and total workEstimate when justifiedSuccess, failure, or cancellation

Figure 10: Keep observations and predictions distinct on screen as well.

“Verifying: 400 / 1,000 items; calculating time remaining” can be useful without a countdown. If displaying a timestamp, distinguish “last increase in progress” from “last successful communication with the UI.” Do not update only the latter in a way that makes a stalled task appear to be advancing normally.

The same principle applies to accessibility. HTML’s progress element can represent indeterminate progress by omitting its value. 10 For a custom ARIA progress indicator, omit aria-valuenow when the value is unknown and provide an accessible name that identifies what is progressing. 11 Both the visual display and the information read aloud should honestly reflect what is known.

10. Frequently asked questions

Does one second remaining without completion mean something has failed?

The display alone cannot decide that. Distinguish an inaccurate estimate, another stage, delayed UI updates, and an actual stall. Both “it is common, so it must be fine” and “a second has passed, so it must be broken” jump to conclusions.

Does 99% mean 1% of the total time remains?

No. Whether the percentage counts files or bytes, the time per unit need not be constant. Multiplying elapsed time by 1% does not give the remaining duration.

Does a spinning animation mean the task is healthy?

An activity indicator and evidence of advancing work are different things. Look at completed work, stages, and logs together. Animation alone does not guarantee that the task can reach successful completion.

Can I show progress without knowing the time remaining?

If the total and completed amounts are known, you can show their ratio. Omit only the countdown when prediction is unreliable. When the total itself is unknown, use an indeterminate indicator with the stage and completed count.

11. Summary: time remaining is a forecast; completion is a result

“One second remaining” does not take a long time because the computer cannot count one second. It takes a long time because observed work is being used to estimate processing time that has not happened yet. Counting units, target discovery, final stages, and delayed UI updates add further complications.

Questions to ask about a progress display that will not finishCheck what the percentage measures, whether predicted speed changed, whether another stage remains, and whether the UI or the actual operation has stalled.Percentage of what?Has predicted speed changed?Does another stage remain?UI stall or processing stall?

Figure 11: Turn frustration with a number into questions you can investigate.

As a user, look at stages and changes rather than numbers alone. As a developer, do not blend measured work, prediction, and results. More important than repeatedly getting “one second” right is explaining what is happening now and what is still unknown. That is the job of a good progress display.

References

  1. Microsoft Learn, LPPROGRESS_ROUTINE callback function. The meaning of byte counts supplied by a copy-progress callback. 

  2. Microsoft, The Old New Thing, Why does the copy dialog give such horrible estimates?. A 2004 explanation of the difficulty of predicting future speed, not a specification of current Windows internals. 

  3. Microsoft Learn, Slow SMB files transfer speed. Repeated file-creation and communication overhead in small-file transfers. 

  4. Microsoft Learn, Progress controls. Controls for determinate and indeterminate progress. 

  5. Microsoft Learn, Progress Bars. Desktop application guidance for progress displays. 

  6. Microsoft Learn, File Caching. File caching and write behavior. 

  7. Microsoft Learn, FlushFileBuffers function. The API for sending a file’s buffered information to the device. 

  8. Microsoft Learn, Threading model. The WPF Dispatcher and UI-thread responsiveness. 

  9. Microsoft Learn, Cancellation in Managed Threads. Cooperative cancellation in .NET. 

  10. WHATWG, The progress element. The HTML progress element and indeterminate state. 

  11. W3C, WAI-ARIA 1.2: progressbar. Naming and value rules for accessible progress information. 

Recent articles sharing the same tags. Deepen your understanding with closely related topics.

These topic pages place the article in a broader service and decision context.

This article connects naturally to the following service pages.

Frequently Asked Questions

Common questions about the topic of this article.

Does a task stuck at one second remaining mean something has failed?
The display alone cannot tell you. Distinguish an inaccurate speed estimate, a final processing stage, a stale UI, and an actual stall. Check changes in counts and logs and look for prompts awaiting input. Do not force the application to quit solely because it says one second remaining.
Does 99% mean only 1% of the total time remains?
No. The meaning depends on whether the percentage measures items, bytes, or weighted stages, and those units need not take equal amounts of time. A progress percentage measures a fraction of work, not time remaining itself.
Does a spinning animation prove that the task is healthy?
No. When animation and processing run independently, the animation can continue while the task waits. Distinguish the animation from evidence of completed work, such as counts, stage changes, and logs.
Can I show a progress bar without an accurate time estimate?
Yes. When the total and completed amounts are known, you can show their ratio and omit the time estimate if speed is unstable. When the total itself is unknown, show the stage or completed count rather than inventing a percentage.

Author Profile

Profile page for the article author.

Go Komura

Representative of KomuraSoft LLC

Focused on Windows software development, technical consulting, and investigations into failures that are difficult to reproduce.

Back to the Blog