[DUG] Terminating a thread
Conor Boyd
Conor.Boyd at trimble.co.nz
Fri Sep 22 09:58:47 NZST 2006
If you're wanting to see how long the thread takes, you'd be better to
just save the value of Now to a temporary StartTime variable or similar
before you start your thread, and then in your OnTerminate method you
can subtract that value from the current value of Now() to get the
elapsed time.
I don't see why you'd use a TTimer to find out how long something is
taking. TTimer is for causing an event to fire at particular intervals.
If you want to keep the label updated as your thread executes you could
have an UpdateLabel method on your form which calculates the elapsed
time since StartTime, and then from within the loop in your thread's
Execute method, use Synchronize(UpdateLabel) to actually tell the form
to update the label.
HTH,
C.
-----Original Message-----
From: delphi-bounces at ns3.123.co.nz [mailto:delphi-bounces at ns3.123.co.nz]
On Behalf Of Nick Fauchelle
I have the TTimer there so I can have a timer displayed on my form so
the user can see how long the process has taken. Perhaps I should move
the Timer out of the Thread and have it on the form instead.... and
then I guess with my OnTerminate I could synchronize a call to
ProgTimer.Enabled := false.
Would that be a better option?
I couldn't do the sleep option below as im not trying to Sleep the
program, more just keep a label updated with a count of the time.
Thanks :-)
Stefan Mueller wrote:
> Timers in a thread sounds indeed very dodgy! - TTimer works with
> windows messages (messageloop from your mainthread ... and you are
> calling into your own thread - this is a big no-no!).
>
> Usually a "Sleep(1000);" (or better a Sleep(50); inside 20 loops with
> a check for terminated) in your "Execute" procedure will be a better
option.
>
> -----Original Message-----
> From: delphi-bounces at ns3.123.co.nz
> [mailto:delphi-bounces at ns3.123.co.nz] On Behalf Of Conor Boyd
>
> I'm not sure initially, but you may have to look at having your
> application (i.e. the main VCL thread) wait at shutdown time until
> your sub thread has successfully terminated after being told to do so.
>
> The other thing is that using Ttimer in a thread may be well dodgy,
> but that's just a hunch. Why are you having to use a timer?
>
> I haven't had to do that myself before, and I'm not sure what the
> timer is doing that's weird.
>
> Look at calling WaitForSingleObject from the main VCL thread or
> similar, and see if that helps. I can't help you with that straight
> off, as I haven't had to do that before.
>
> Good luck. If I think of anything else, I'll let you know.
>
> -----Original Message-----
> From: delphi-bounces at ns3.123.co.nz
> [mailto:delphi-bounces at ns3.123.co.nz]
> On Behalf Of Nick Fauchelle
>
> Hmmm ok,
> So I got that going, and all seems well - my thread has set
> freeonterminate := true; when it was created.
> But when I terminate it (try) it seems to work, except when I then
> close the application I get a Access Violation error..
>
> This only happens when I have objects freeing in my destructor like so
> begin
> ProgTimer.Free;
> ADOQ1.Free;
> IdHttp.Free;
> inherited;
> end;
>
> However, if I don't have them there - my ProgTimer (TTimer) still
> counts the count, even if I terminate the thread...
> that was created like so in the creator
> ----
> ProgTimer := TTimer.Create(nil);
> ProgTimer.OnTimer := ProgTimerTimer;
> ProgTimer.Interval := 1000;
> ProgTimer.Enabled := true;
>
> Both ProgTimer : TTimer and it's OnTimer event are declared in the
> private section of my thread.
> ---
>
> Im thinking it may have something to do with the nil.
>
> So,
> If I terminate, ProgTimer.OnTimer will still fire.
> If I call ProgTimer.Free with the destructor then the timer stops
> firing, but the program access violations when I close it.
[snip]
More information about the Delphi
mailing list