On Mon, 27 Nov 2006 00:14:39 +0100, Matthew Comb <[EMAIL PROTECTED]> wrote:

You are creating your critical section within your worker thread. This
won't protect anything as all of your worker threads will have their own
instance of the critical section.

Hmm, I do this at a few more places too. What should I do instead?
Actually, THIS may be what's causing the error. When I process a keyword, I put the result into the following structure:

  GoogleResult = ^ResultRec;
  ResultRec = packed record
    next: GoogleResult;
    srNo: integer;
    // etc...
  end;

This GoogleResult is then used as a global variable. The main form has a public property ResultList: GoogleResult. Each thread has a pointer back to the main form. To ass the result to the list, I write

AddItem(mainForm.ResultList, newItem);

And this is the procedure:

procedure AddItem(var list: GoogleResult; const item: GoogleResult);
var
  tmp: GoogleResult;
  critical: _RTL_CRITICAL_SECTION;
begin
  try
    InitializeCriticalSection(critical);
    EnterCriticalSection(critical);
    if list = nil then
      list := item
    else begin
      tmp := list;
      while tmp^.next <> nil do
        tmp := tmp^.next;
      tmp^.next := item;
    end;
    LeaveCriticalSection(critical);
    DeleteCriticalSection(critical);
  except on Exception do { nothing }
  end
end;

You see I've put everything in a critical section? So this won't do anything because I'm calling the procedure from the thread? What should I do instead, use Synchronize? Hmm or maybe I should just use a TThreadList here as well. I've left this old list for historical reasons (in the previous version the program was single threaded).

You are creating your critical section to access a boolean ? This is not
needed as you cannot have a conflict on a boolean type.

There's a checkbox on the main form which enables/disables caching. If I change it while a thread is accessing the variable then there can be a conflict.

Are any of your worker threads passed the same file name ? This for sure
would cause a problem.

No they each create their own random-named file, before making sure it doesn't exist.

Csaba

_______________________________________________
Delphi mailing list
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi

Reply via email to