[delphi] ThreadSafe Queue geeft Privilege Error

Pagina: 1
Acties:

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Topicstarter
Helaas krijg ik de volgende foutmeldingen niet op mijn eigen computer of de computers waar ik het op test (sommige die het programma gebruiken krijgen dit dus), maar als ik een item op mijn queue wil plaatsen (in een thread) dan krijg ik 1 van deze foutmeldingen:
Type : EPrivilege
Message: Privileged instruction

Type : EAccessViolation
Message: Access violation at address [...] in module [...] read of address [...]
Om er voor te zorgen dat de queue 'veilig' is in de thread heb ik de class een extend van TQueue gemaakt, met oa. de PushItem die er voor zorgt met behulp van een CriticalSection veilig wordt aangesproken:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Queue:
// Declaratie

  private
    CS    : TCriticalSection;

// [...]

procedure TThreadSafeQueue.PushItem(AItem: Pointer);
begin
  CS.Acquire();
  try
    inherited;
  finally
    CS.Release();
  end;
end;

// Background Thread:
// Declaratie:

  Buffer: TThreadSafeQueue;

// [...]

procedure TBackgroundThread.Add(Object: TObject);
begin
  Buffer.PushItem(Object);
end;

// De code die de add aanroept in de hoofdthread

// blabla onClick...
  BackgroundThread.Add(HetObject);


Heeft iemand enig idee waar het aan kan liggen dat ik 1 van die foutmeldingen krijg, en of dit aan de PushItem functie ligt, of dat het een andere oorzaak heeft.

[ Voor 3% gewijzigd door Scorpion op 14-02-2004 19:47 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Klinkt eerder als een 'gewone' access violation die toevallig in een verkeerd stuk geheugen valt. Weet je zeker dat je alles netjes gecreerd hebt enzo?

[ Voor 24% gewijzigd door LordLarry op 15-02-2004 11:58 . Reden: typo ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Type : EPrivilege
Message: Privileged instruction

=> controleer de variabelen op de stack. Privileged instruction komt 'meestal' doordat een returnpointer op de stack overschreven wordt en je nu op een 'willekeurige' plek code gaat uitvoeren. (waar als de data geinterpreteerd wordt als code een ongeldige instructie staat)