[DUG] Program crashes - anyone knows why?
Gajo Csaba
csaba at enyem.com
Mon Nov 27 12:58:37 NZDT 2006
I've replaced my list with TThreadList. I'm also making changes in all the
critical sections so they would use global variables. Thanks for the help,
I hope this will be it :)
On Mon, 27 Nov 2006 00:55:34 +0100, Matthew Comb <matt at ferndigital.com>
wrote:
> 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
>>
>
>
> _______________________________________________
> Delphi mailing list
> Delphi at ns3.123.co.nz
> http://ns3.123.co.nz/mailman/listinfo/delphi
>
>
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
More information about the Delphi
mailing list