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 SetProcessAffinityMask innerhalb einer DLL verwenden? (https://www.delphipraxis.net/191889-setprocessaffinitymask-innerhalb-einer-dll-verwenden.html)

devidespe 28. Feb 2017 17:13

SetProcessAffinityMask innerhalb einer DLL verwenden?
 
Hallo,

der Einsatz von SetProcessAffinityMask ist mir vollständig bekannt und ich verwende das bereits in meiner Applikation. Nun geht es bei der Auslagerung eines bestimmten Codeabschnitts in einer DLL darum, dass dort ebenfalls SetProcessAffinityMask mit ausgelagert werden und von der DLL verwendet werden soll. Der DLL-Code an sich funktioniert auch problemlos, allerdings erscheint beim Beenden der DLL-Applikation eine Access Violation, wenn ich dort auf "Anhalten" drücke, springt der Debugger in die Datei c:\Program Files (x86)\Embarcadero\Studio\18.0\source\rtl\sys\getme m.inc in Zeile 2080:

Delphi-Quellcode:
mov [eax + edx - 8], edx


Darunter kann ich mir nicht wirklich was vorstellen.

Nun habe ich nochmals die offizielle Dokumentation für SetProcessAffinityMask hier https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx durchgelesen und da steht ein Satz drin, der mich stutzig macht:

Do not call SetProcessAffinityMask in a DLL that may be called by processes other than your own.

Hat von Euch schonmal jemand SetProcessAffinityMask in einer DLL verwendet bzw. kann mir einen Tipp geben, wie ich die Meldung wegbekomme oder wo ich weiter ansetzen kann? Vielen Dank.

himitsu 28. Feb 2017 22:11

AW: SetProcessAffinityMask innerhalb einer DLL verwenden?
 
Zitat:

Zitat von devidespe (Beitrag 1362900)
Do not call SetProcessAffinityMask in a DLL that may be called by processes other than your own.

Wenn die DLL nur von deinem Programm (Prozess) aufgerufen wird, dann ignoriere das.

Aber mich würde es auch ankotzen, wenn irgendeine DLL global an meinem Prozess rumfummelt, also nicht nur an Dingen, die nur zu dieser DLL gehören.

PS:
Zitat:

SetThreadAffinityMask

Zacherl 1. Mär 2017 13:13

AW: SetProcessAffinityMask innerhalb einer DLL verwenden?
 
Das sieht für mich eher so aus, als würdest du ein Objekt/Speicher mehrfach freigeben. Eventuell eine Race-Condition?

Neutral General 1. Mär 2017 13:19

AW: SetProcessAffinityMask innerhalb einer DLL verwenden?
 
Bist du dir sicher, dass es an SetProcessAffinityMask liegt?
Hast du mal geschaut ob der Fehler auch auftaucht wenn du SetProcessAffinityMask nicht aufrufst?

devidespe 2. Mär 2017 13:13

AW: SetProcessAffinityMask innerhalb einer DLL verwenden?
 
Zitat:

Zitat von Neutral General (Beitrag 1362960)
Bist du dir sicher, dass es an SetProcessAffinityMask liegt?
Hast du mal geschaut ob der Fehler auch auftaucht wenn du SetProcessAffinityMask nicht aufrufst?

Habe ich nachgeprüft, es liegt nicht an SetProcessAffinityMask. Es liegt an der Erweiterung eines OpenArray-Parameters in einer DLL-Funktion (das hatte ich hier http://www.delphipraxis.net/191814-d...ml#post1362766) schon mal geschrieben.

Seltsamerweise funktioniert die Erweiterung des OpenArrays sonst wunderbar, nur in einem Codeabschnitt nicht (oder zumindest resultiert die OpenArray-Erweiterung in einer Access Violation, wenn ich das Programm beende).

Vom Prinzip ermittle ich die Anzahl logischer CPU-Kerne, setze nacheinander jeden einzelnen Kern als aktiv, führe einen bestimmten Lesebefehl durch, und springe zum nächsten Kern weiter. Meine CPU hat 8 logische Kerne, und wenn ich die Schleife auf 5 begrenze, funktioniert alles noch. Erst ab dem 6. Kern kommt diese Access Violation, die ich weiter oben beschrieben habe.

Zacherl 2. Mär 2017 13:59

AW: SetProcessAffinityMask innerhalb einer DLL verwenden?
 
Wie schon gesagt, das klingt ziemlich stark nach einer Race-Condition.

Zitat:

Zitat von devidespe (Beitrag 1363022)
Vom Prinzip ermittle ich die Anzahl logischer CPU-Kerne, setze nacheinander jeden einzelnen Kern als aktiv, führe einen bestimmten Lesebefehl durch, und springe zum nächsten Kern weiter. Meine CPU hat 8 logische Kerne, und wenn ich die Schleife auf 5 begrenze, funktioniert alles noch. Erst ab dem 6. Kern kommt diese Access Violation, die ich weiter oben beschrieben habe.

Hat das irgendeinen speziellen Grund, dass du nicht einfach direkt Threads verwendest?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz