AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein InterlockedIncrement in welcher Unit?
Thema durchsuchen
Ansicht
Themen-Optionen

InterlockedIncrement in welcher Unit?

Ein Thema von delphifan2004 · begonnen am 30. Okt 2024 · letzter Beitrag vom 30. Okt 2024
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.650 Beiträge
 
Delphi 12 Athens
 
#1

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 09:40
In der Windows Unit ist sie offenbar nicht.
Ist sie doch:
Delphi-Quellcode:
function InterlockedIncrement(var Addend: Integer): Integer; stdcall; inline;
{$EXTERNALSYM InterlockedIncrement}
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
279 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 11:12
Danke soweit, aber dann stimmt irgendwas in meinen Projekteinstellungen nicht. Hab System.SynObjs jetzt in der Uses Klausel aber der Compiler meldet Routine immer noch als nicht gefunden.

Was könnte da noch faul sein?

Ist da eventuell die Schreibweise falsch:

so steht die Routine in meinem Projekt:

InterlockedIncrement --- mit Copy und Paste aus dem Projekt hierher kopiert!

Kann ich mir echt nicht erklären, habe doch Delphi nach Standard installiert!

Geändert von delphifan2004 (30. Okt 2024 um 11:19 Uhr)
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
462 Beiträge
 
Delphi 12 Athens
 
#3

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 11:27
Vielleicht könntest du uns auch mal eine ganze Zeile Code zeigen?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.650 Beiträge
 
Delphi 12 Athens
 
#4

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 11:29
Dann zeig doch mal den ganzen Code (falls zu groß als Anhang). Manchmal sieht man ja den Wald vor lauter Bäumen nicht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
462 Beiträge
 
Delphi 12 Athens
 
#5

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 11:32
Oder du probierst das mal ganz einfach aus:
Delphi-Quellcode:
procedure TFMain.Button1Click(Sender: TObject);
var A: Integer;
begin
A:=1;
Winapi.Windows.InterlockedIncrement(A);
showmessage(A.ToString);
end;
Da sollte dann 2 rauskommen.
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
279 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 11:43
Das hieße ja dass ich die Klasse TInterlocked nicht erst instanziieren muss?

Ich habe ein Internet Beispielprogramm das mir einen eigenen Speichermanager bereit stellt, ich habe mir daraus die folgende Unit gebaut:

Delphi-Quellcode:
unit mem_mgr;

interface
uses Windows, System.SyncObjs;

var
  OldMemMgr : TMemoryManagerEx;
  GetMemCalls : Integer;
  FreeMemCalls : Integer;
  MaxAvail : Integer;
  ReallocMemCalls : Integer;
  AllocMemCalls : Integer;

function MyGetMem(Size: Integer): Pointer;
function MyFreeMem(P: Pointer): Integer;
function MyReallocMem(P: Pointer; Size: Integer): Pointer;
function MyAllocMem(Size: Cardinal): Pointer;


implementation

//uses System.SyncObjs;

function MyGetMem(Size: Integer): Pointer;
begin
  { Route the call. }
  Result := OldMemMgr.GetMem(Size);

  { Safely increment the counter. }
  winapi.windows.InterlockedIncrement(GetMemCalls); //Bereits hier meckert der Compiler
end;

function MyFreeMem(P: Pointer): Integer;
begin
  { Route the call. }
  Result := OldMemMgr.FreeMem(P);

  { Safely increment the counter. }
  Interlocke1dIncrement(FreeMemCalls);
end;

function MyReallocMem(P: Pointer; Size: Integer): Pointer;
begin
  { Route the call. }
  Result := OldMemMgr.ReallocMem(P, Size);

  { Safely increment the counter. }
  InterlockedIncrement(ReallocMemCalls);
end;

function MyAllocMem(Size: Cardinal): Pointer;
begin
  { Route the call. }
  Result := OldMemMgr.AllocMem(Size);

  { Safely increment the counter. }
  InterlockedIncrement(AllocMemCalls);
end;

(*
procedure TForm2.btPerformSomethingClick(Sender: TObject);
var
  X : Integer;
  I : ^Integer;
begin
  { Perform some allocations and free operations. }
  for X := 0 to 999 do
  begin
    New(I);
    Dispose(I);
  end;
end;

procedure TForm2.btUseMyMemMgrClick(Sender: TObject);
var
  MyMemMgr : TMemoryManagerEx;
begin
  { Switch button states. }
  btUseSystemMemMgr.Enabled := true;
  btUseMyMemMgr.Enabled := false;

  { Get the old memory manager. }
  GetMemoryManager(OldMemMgr);

  { Create your instance. }
  MyMemMgr.GetMem := MyGetMem;
  MyMemMgr.FreeMem := MyFreeMem;
  MyMemMgr.ReallocMem := MyReallocMem;
  MyMemMgr.AllocMem := MyAllocMem;

  { Use the defaults for this--not important. }
  MyMemMgr.RegisterExpectedMemoryLeak := OldMemMgr.RegisterExpectedMemoryLeak;
  MyMemMgr.UnregisterExpectedMemoryLeak := OldMemMgr.UnregisterExpectedMemoryLeak;

  { Clear out the count variables. }
  GetMemCalls := 0;
  FreeMemCalls := 0;
  ReallocMemCalls := 0;
  AllocMemCalls := 0;

  { Install the new memory manager. }
  SetMemoryManager(MyMemMgr);
end;
*)

end.
Ich dachte zuerst man müsse eine Klasse vom Typ TInterlocked instanziieren, um Interlocked verwenden zu können wie oben ein User suggereiert hat der mich auf die DocWiki verwiesen hat. Demnach brauche ich ja die Klsse TInterlocked, die aber in diesem Internetbeispiel nicht verwendet wird.

Wie aufwendig ist eigentlich der Bau einer eigenen Interlocked Routine um mein Problem zu umgehen?
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
462 Beiträge
 
Delphi 12 Athens
 
#7

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 11:49
Und was ist das?
Delphi-Quellcode:
function MyFreeMem(P: Pointer): Integer;
begin
  { Route the call. }
  Result := OldMemMgr.FreeMem(P);

  { Safely increment the counter. }
  Interlocke1dIncrement(FreeMemCalls);
end;
Interlocke1???
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.650 Beiträge
 
Delphi 12 Athens
 
#8

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 11:56
Außerdem:
Delphi-Quellcode:
interface
uses Windows, System.SyncObjs;
aber dann:
Delphi-Quellcode:
  { Safely increment the counter. }
  winapi.windows.InterlockedIncrement(GetMemCalls); //Bereits hier meckert der Compiler
Entweder WinApi an beiden Stellen (empfohlen) oder an keiner.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
279 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 12:22
Genau da meckert aber mein Compiler Delphi 11.3 Community Edition und genau das kann ich mir nicht erklären. Ich weiß neichet mehr was ich noch tun soll. Warum gibt es solche böden Fehler nur bei Mir?

Besser ich baue mir eine eigene Rotine dafür aber wie fange ich das an? Da zugehörige Projet ist im Delphi Pfad wie er installiert ist under dem Ordner Prokekte.Delphi legt ja dafür unter

c:\Users\Konta\Documents\Embarcadero\Studio\Projek te\

meinen Pfad an und dort gibt es meinjen Unterordner für das Projekt. Für jedes Projekt ein Unterordner in /Projekte

Warum findet der Compiler dann eine Unit nicht? Bin verzweifelt!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: InterlockedIncrement in welcher Unit?

  Alt 30. Okt 2024, 12:59
Das hieße ja dass ich die Klasse TInterlocked nicht erst instanziieren muss?
Natürlich nicht, denn
Delphi-Quellcode:
  TInterlocked = class sealed
  public
    class function Increment(var Target: Integer): Integer; overload; static; inline;
    class function Increment(var Target: Int64): Int64; overload; static; inline;
(man beachte das CLASS)

Delphi-Quellcode:
var MyVar: Integer;

AtomicIncrement(MyVar); // die System.pas ist immer eingebunden
InterlockedIncrement(MyVar); // Winapi.Windows.pas
TInterlocked.Increment(MyVar); // System.SyncObjs.pas
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz