[DUG] Program crashes - anyone knows why?
Matthew Comb
matt at ferndigital.com
Mon Nov 27 12:55:34 NZDT 2006
Another thing to consider.
If this is infact your problem, try except in your execute will not help
you. (Still a good idea, but will not help with your customer's issue)
Matt.
> On Mon, 27 Nov 2006 00:14:39 +0100, Matthew Comb <matt at ferndigital.com>
> 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
> Delphi at ns3.123.co.nz
> http://ns3.123.co.nz/mailman/listinfo/delphi
>
More information about the Delphi
mailing list