[fpc-devel] Weird problem with Threads!

amir amir at aavani.net
Tue Jan 20 08:11:58 CET 2009


Hi,

I encountered a very mysterious problem within my code. I have an 
application which uses threads. There is a class TMyThread which perform 
some jobs. In the constructor of this class, I set FreeOnTerminate 
variable to False. My application creates a series for TMyThread, the 
i-th series is stored in ThreadsForSE [i]. I need to ensure all threads 
are finished before finishing the application.

I used two approaches for this purpose. The first is to have the code 
flagged with (1) and remove those flagged with (2). and the other is to 
remove the line flagged with (1) and keep those flagged with (2). Both 
approaches seem to be the same, at least for me. But using the second 
approach, my code get access violation error.

I have not implemented a "Destroy destructor for MyThread class. I am 
sure that my Collection class is work correctly.

Why two approaches are not functioning the same?

ThreadsCol: TCollection;
ActiveThreadCollection: TCollection;
ActiveThread: TMyThread;

  for i:= 0 to High (ThreadsCol) do
  begin
    ActiveThreadCollection:= ThreadsCol [i];

    for j:= 0 to ActiveThreadCollection.Size- 1 do
    begin
      ActiveThread:= (ActiveThreadCollection.Member [j] as TMyThread);
      if ActiveThread.Suspended then
        ActiveThread.Resume;

      WaitForThreadTerminate (ActiveThread.ThreadID, 0);
 (1)     ActiveThread.Free;

    end;

(2)    for j:= 0 to ActiveThreadCollection.Size- 1 do
(2)    begin
(2)      ActiveThread:= (ActiveThreadCollection.Member [j] as 
TAskQueryThread);
(2)      ActiveThread.Free;
(2)
(2)    end;

    ActiveThreadCollection.Clear;
    ActiveThreadCollection.Free;

  end;




More information about the fpc-devel mailing list