Solved

Thread Exiting Problems

Posted on 1997-09-15
1
151 Views
Last Modified: 2010-04-04
Hello,

    I have a thread which does some painting on the screen. During the Execute method I repeatedly call a procedure (which is in another unit). This procedure itself has a longish (1 or 2 seconds) for...do loop, and I need to include Application.ProcessMessages in this loop, because if the user clicks the form during this loop, I want the application to end (a la screensaver). So in the execute method of MyThread I have:

 while not Terminated do begin
      Synchronize (PaintIt);
      Delay(1000)           // 1 second
 end

PaintIt is a thread procedure which has the following code:

//some code before this
PaintLoop(Canvas);

and finally, PaintLoop, is a procedure in another unit which looks like:

for i := 1 to 1000 do begin
  BitBlt(bla bla bla);
  Application.ProcessMessages;
end;

So, in the mouse click event of the main form, I say:

MyThread.Terminate;
Close;

The PROBLEM is that after the FormClose event, the application doesn't end, and attempts to go back to the for...do loop in the PaintLoop procedure. Problem, of course, is that all of the canvases have by now been Free'd, and I therefore get an access violation. Why is it going back to the for...do loop, and what can I do to stop this!?

Note: If I click on the form after the for...do loop (i.e. during the 1 second delay) then the application terminates nicely.
0
Comment
Question by:wolfcrag
1 Comment
 
LVL 5

Accepted Solution

by:
JimBob091197 earned 100 total points
Comment Utility
It would appear that your for loop in PaintIt needs to get all the way to 1000, even if the thread terminates when i = 10.

Here are 2 possible solutions:
1)  Change the for loop in PaintLoop to a while loop, and exit the loop early if the thread terminates.

2)  Create a variable or something which the thread sets to True when it's finished.  E.g. In your form's MouseClick event add the following:
    MyThread.Terminate;
    while  not OkToExit  do
        Application.ProcessMessages;
    Close;
Your thread's Execute method would then look something like this:
    OkToExit := False;
    while not Terminated do begin
        Synchronize(PaintIt);
        Delay(1000);
    end;
    OkToExit := True;

0

Featured Post

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

Suggested Solutions

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This video shows how to remove a single email address from the Outlook 2010 Auto Suggestion memory. NOTE: For Outlook 2016 and 2013 perform the exact same steps. Open a new email: Click the New email button in Outlook. Start typing the address: …
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now