Most every long running program contain repetition in the form of loops, or recursion, or a set of work items to be processed; and the number of repetitions are normally known, or are quickly estimable.
If you time the first repetition and multiply by the known or first estimation of the repetition count, you can approximate the total time and derive a %complete.
As the time taken for each repetition can vary, you can time each successive repetition and adjust the percentage dynamically.
You'll get better/more specific suggestions if you give us more information about the nature of your program.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.