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 [gelöst] SetPriorityClass: Idle ist nicht wirklich idle? (https://www.delphipraxis.net/50899-%5Bgeloest%5D-setpriorityclass-idle-ist-nicht-wirklich-idle.html)

dizzy 2. Aug 2005 14:19


[gelöst] SetPriorityClass: Idle ist nicht wirklich idle?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Ich habe ein Progrämmchen geschrieben dass alle in einem Ordner befindlichen jpegs auf inhaltliche Ähnlichkeit überprüft und protokolliert. Da dies (weil ja jedes Bild gegen jedes andere geprüft werden muss) schon mal etwas länger dauern kann, schraube ich die Priotität runter. Ich hatte dies schon mal vor ein paar Monaten mit einem Thread gemacht, wobei ich aber arge Probleme mit der jpeg-Uhit bekam. Sie scheint nicht Threadsicher zu sein, und ich bekam reihenweise Fehler der Art "nicht genügend Arbeitsspeicher" (so ähnlich). Im Mainthread haben exakt die selben Funktionen tadellos funktioniert, und ich hatte auch keine Speicherlecks.
Nun, einige Zeit später, habe ich mich diesem Teil wieder gewidmet, und es diesmal mit "SetPriorityClass" probiert. Und siehe da: Keine Fehler! Jetzt das dicke aber was mich zu meiner Frage hier treibt: Selbst wenn der Prozess auf IDLE gesetzt ist verhält er sich nicht im geringsten so. Wenn ich z.B. nebenbei ein Framebased Spiel spiele dass in aller Regel 100% CPU einfordert, bollert mein Programm trotzdem im Hintergrund weiter und sorgt für reichlich Ruckelei. Ein Thread hingegen bleibt bei selben Bedingugen tatsächlich stehen. Wie bekomme ich dieses Verhalten für meinen ganzen Prozess?

Zum Nachvollziehen habe ich den Quelltext angehängt. Zum Kompilieren ist noch die Graphics32 erforderlich.

Besten Dank schon mal!
Fabian

NicoDE 2. Aug 2005 14:23

Re: SetPriotrityClass: Idle ist nicht wirklich idle?
 
Die tatsächliche Priorität setzt sich aus der Basispriorität des Prozesses und der Priorität des Threads zusammen...
(die Fehler könnten auf die Verwendung von GDI-Funktionen zurückzuführen sein, die selbst nicht thread-sicher sind)

Olli 2. Aug 2005 14:39

Re: SetPriotrityClass: Idle ist nicht wirklich idle?
 
MSDN-Library durchsuchenSetThreadPriorityBoost und MSDN-Library durchsuchenSetThreadPriority schon erwogen?

Übrigens: im Titel ist ein Freibschäler ...

dizzy 2. Aug 2005 15:01

Re: SetPriotrityClass: Idle ist nicht wirklich idle?
 
Danke euch beiden! Das mit der GDI klingt sehr wahrscheinlich. Woher bekomme ich denn ein Handle auf meinen Mainthread? kann ich da einfach auch das Prozesshandle verwenden?

Zitat:

Zitat von Olli
Übrigens: im Titel ist ein Freibschäler ...

thx, jetzt nicht mehr :)

Olli 2. Aug 2005 15:04

Re: SetPriotrityClass: Idle ist nicht wirklich idle?
 
Zitat:

Zitat von dizzy
Danke euch beiden! Das mit der GDI klingt sehr wahrscheinlich. Woher bekomme ich denn ein Handle auf meinen Mainthread? kann ich da einfach auch das Prozesshandle verwenden?

Als Pseudohandle mit: MSDN-Library durchsuchenGetCurrentThread() oder kombiniert für ein echtes Handle: MSDN-Library durchsuchenGetCurrentThreadId() und MSDN-Library durchsuchenOpenThread().

dizzy 2. Aug 2005 15:23

Re: SetPriorityClass: Idle ist nicht wirklich idle?
 
GetCurrentThread reicht vollkommen aus. Problem gelöst, nun läuft's so wie ich mir das vorgestellt hab :). Vielen Dank nochmals!


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