Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Anzahl von Semaphore-Objekten bestimmen. (https://www.delphipraxis.net/30588-anzahl-von-semaphore-objekten-bestimmen.html)

mirage228 26. Sep 2004 19:17


Anzahl von Semaphore-Objekten bestimmen.
 
Hallo,

ich erstelle eine Semaphore mit CreateSemaphore und öffne sie anderer Stelle mit OpenSemaphore.

Nun kann man ja bei CreateSemaphore den Anfangs-Count und den Max-Count angeben. Nun habe ich mich gefragt, ob es denn eine Möglichkeit gibt den aktuellen Count herauszufinden.

Im MSDN bin ich nicht fündig geworden, weiss es jemand von euch?

mfG
mirage228

tommie-lie 26. Sep 2004 20:19

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Soweit ich weiß nicht, aber ich wüsste auch nicht, wozu man da praktisch brauchen sollte.

mirage228 26. Sep 2004 20:25

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Hi,

naja, schade :-(. Ich müsste das nämlich Überprüfen, da ich bestimmte Aktionen davon abhängig machen wollte.

mfG
mirage228

tommie-lie 26. Sep 2004 20:33

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Zitat:

Zitat von mirage228
naja, schade :-(. Ich müsste das nämlich Überprüfen, da ich bestimmte Aktionen davon abhängig machen wollte.

Wieso denn abhängig davon, wie groß der Count ist?
Semaphoren sollen eigentlich Zugriffe auf eine bestimmte Anzahl beschränken. Auf welche sollte eigentlich egal sein. Du legst beim Erzeugen beispielsweise fest, daß höchstens 5 Threads auf eine Datenbank zugreifen dürfen, und wenn der 6te Thread erzeugt wird und ankommt, um auf die Semaphore zu warten (WaitForsingleObject), wird der 6te halt stillgelegt und kommt erst wieder an die Reihe, wenn einer der anderen fertig ist.

DaFox 26. Sep 2004 20:36

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Hi,

mit der undokumentierten Funktion NtQuerySemaphore() sollte das unter NT möglich sein.

Gruß,
Markus

tommie-lie 26. Sep 2004 20:39

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Gibt's da auch die passende DLL dazu, die die Funktion exportiert?
Zumindest mein Delphi6 PE kennt diese Funktion nämlich noch nicht.

Edit: gefunden

DaFox 26. Sep 2004 20:43

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Zitat:

Zitat von tommie-lie
Gibt's da auch die passende DLL dazu, die die Funktion exportiert?

Zitat:

Zitat von DaFox
NtQuerySemaphore()

Zitat:

Zitat von tommie-lie
Zumindest mein Delphi6 PE kennt diese Funktion nämlich noch nicht.

Zitat:

Zitat von DaFox
...undokumentierten Funktion...

Gruß,
Markus

tommie-lie 26. Sep 2004 20:46

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Jaja, war unüberlegt, ich geb's ja zu...

DaFox 26. Sep 2004 20:48

Re: Anzahl von Semaphore-Objekten bestimmen.
 
So war's nicht gemeint, wollte es nur nicht doppelt schreiben! :wink:

Gruß,
Markus

tommie-lie 26. Sep 2004 20:51

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Zitat:

Zitat von DaFox
So war's nicht gemeint

Hääte es aber ruhig sein können ;-)

w3seek 26. Sep 2004 23:14

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Delphi-Quellcode:
const
  SemaphoreBasicInformation = 0;

type
  SEMAPHORE_BASIC_INFORMATION = record
    CurrentCount: Integer;
    MaximumCount: Integer;
  end;
  PSEMAPHORE_BASIC_INFORMATION = ^SEMAPHORE_BASIC_INFORMATION;

function NtQuerySemaphore(SemaphoreHandle: THandle;
                          SemaphoreInformationClass: ULONG;
                          SemaphoreInformation: Pointer;
                          SemaphoreInformationLength: ULONG;
                          ReturnLength: PULONG): Integer; stdcall; external 'ntdll.dll';
function RtlNtStatusToDosError(StatusCode: Integer): DWORD; stdcall; external 'ntdll.dll';

function GetSemaphoreInfo(hSemaphore: THandle; var CurrentCount: Integer; var MaximumCount: Integer): Boolean;
var
  sbi: SEMAPHORE_BASIC_INFORMATION;
  Status: Integer;
begin
  Result := false;
  Status := NtQuerySemaphore(hSemaphore,
                             SemaphoreBasicInformation,
                             @sbi,
                             SizeOf(SEMAPHORE_BASIC_INFORMATION),
                             nil);
  if Status >= 0 then
  begin
    CurrentCount := sbi.CurrentCount;
    MaximumCount := sbi.MaximumCount;
    Result := true;
  end
  else
    SetLastError(RtlNtStatusToDosError(Status));
end;

mirage228 27. Sep 2004 05:59

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Hi,

super :thumb: Danke dir :love:

Ich werds gleich heut Nachmittag ausprobieren :)

mfG
mirage228

Luckie 27. Sep 2004 06:03

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Man sollte nicht auf undokumentierte API Funktionen sein Programm aufbauen. Sie sind nicht umsonst von MS nicht dokumentiert und somit nicht offiziell zur Verwendung frei gegeben. Warum kann man hier nachlesen:
http://weblogs.asp.net/oldnewthing/a.../23/45481.aspx

w3seek 27. Sep 2004 13:51

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Luckie, ich weiss ;) allerdings ist es bei der funktion mehr als unwahrscheinlich (siehe 2. Parameter) - ich bin auch gegen die Benutzung undokumentierter API ;) aber ich benutz den code bzw die Programme die darauf basieren ja nicht ;)

Die meisten Probleme die Raymond Chen anspricht sind wirklich haertere dinge, z.b. dass Programme ein bestimmtes Stack layout erwarten, einfach so im NTFS filesystem rumpfuschen oder absolut undokumentierte interne shell strukturen die sich schon immer staendig geaendert haben. Wie gesagt ich halte es fuer sehr unwahrscheinlich dass diese Funktion geaendert wird da sie mit Sicherheit auch vom ein oder anderen Treiber verwendet wird (ZwQuerySemaphore()).

w3seek 27. Sep 2004 13:58

Re: Anzahl von Semaphore-Objekten bestimmen.
 
Insbesondere nachdem Microsoft endlich NtQueryInformationProcess() und NtQueryInformationThread() dokumentiert hat, da liegt nahe dass die anderen auch in naher Zukunft noch dokumentiert werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 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