Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Interlocked* mit Operator Überladung

  Alt 8. Jan 2010, 16:41
sowas könnte gehn
Delphi-Quellcode:
type
  TThreadSafeInteger = record
  private
    Value: Integer;
  public
    class operator Implicit(a: TThreadSafeInteger): Integer;

    procedure Put (i: Integer);
    procedure Add (i: Integer);
    procedure Subtract(i: Integer);
    procedure Inc;
    procedure Dec;
    property Get: Integer read Value;
  end;

class operator TThreadSafeInteger.Implicit(a: TThreadSafeInteger): Integer;
begin
  result := a.Value;
end;

procedure TThreadSafeInteger.Put(i: Integer);
begin
  InterlockedExchange(Value, i);
end;

procedure TThreadSafeInteger.Add(i: Integer);
begin
  InterlockedExchangeAdd(Value, i);
end;

procedure TThreadSafeInteger.Subtract(i: Integer);
begin
  InterlockedExchangeAdd(Value, -i);
end;

procedure TThreadSafeInteger.Inc;
begin
  InterlockedIncrement(Value);
end;

procedure TThreadSafeInteger.Dec;
begin
  InterlockedDecrement(Value);
end;
theoretisch ginge auch sowas,
Delphi-Quellcode:
class operator TThreadSafeInteger.Implicit(a: TThreadSafeInteger): Integer;
asm
  //mov eax, &a
end;

procedure TThreadSafeInteger.Put(i: Integer);
asm
  lock mov [&Self], &i
end;

procedure TThreadSafeInteger.Add(i: Integer);
asm
  lock add [&Self], &i
end;

procedure TThreadSafeInteger.Subtract(i: Integer);
asm
  lock sub [&Self], &i
end;

procedure TThreadSafeInteger.Inc;
asm
  lock inc [&Self]
end;

procedure TThreadSafeInteger.Dec;
asm
  lock dec [&Self]
end;
wenn da nicht der blöde Fehler im LOCK MOV wäre
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project3.exe ist eine Exception der Klasse EExternalException mit der Meldung 'Externe Exception C000001E' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
$2B or not $2B
  Mit Zitat antworten Zitat