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 Priorität von Prozessen ändern (https://www.delphipraxis.net/27746-prioritaet-von-prozessen-aendern.html)

Borti 15. Aug 2004 10:43


Priorität von Prozessen ändern
 
Hallo!
Ich brauche für einen Thread meines programms den prozessor über einen Zeitraum von ein paar Minuten ohne Unterbrechung für mich alleine. Die bisherige idee ist, dass ich einfach meinem Thread die höchste priorität von 31 erteile. ich weiß, mir wurde schon hier im Forum davon abgeraten, aber ich komm nicht drumrum. erstmal bevor ich mich in's "Vergnügen" stürze: Gibt es noch etwas anderes, dass auf der stufe 31 arbeitet und wenn ja, was?
Gruß,
Borti

Luckie 15. Aug 2004 12:32

Re: Priorität von Prozessen ändern
 
Was ist sStufe "31"? Wenn es TIMECRITICAL ist dann würde ich wirklich DRINGENST davon abraten und ich kann mir keinen Prozess vorstellen der über Minuten ohne Unterbrechnung die CPU beanspruchen können muss. Der Grund ist klar, selbt Systemthreads laufen höchstens mit der Priorität HOCH bzw. HÖHER ALS NORMAL.

Also warum darf dein Prozess nicht unterbrochen werden?

Wenn wir hier von Prozess reden, dann reder wir aber doch wohl vone einem abgespaltenen Thread innerhalb des Hauptthreads der nicht unterbrochen werden darf oder?

PS: Sollte es noch so ein Programm von jemandfen auf dem Rechner laufen, der davon überzeugt ist, dass sein Thread nicht unterbrochen werden dürfte und der dann auch mit TIMECRITICAL läuft, dann wird auch dein wharscheinlich Thread unterbrochen.

moritz 15. Aug 2004 13:11

Re: Priorität von Prozessen ändern
 
Vielleicht hilt dir das: http://swissdelphicenter.ch/de/showcode.php?id=387
Aber mich würde auch interessieren für was du das brauchst?

Borti 15. Aug 2004 14:56

Re: Priorität von Prozessen ändern
 
Hallo!
(hi Luckie! ich kommm grad von deinem Tutorial)
also, ich schreib mir grad ein porgramm zum Erfassen von Messwerten. Das ganze muss natürlich kontinuierlich vor sich gehen und ich kann nicht drauf hoffen, dass ich ab und zu eine Prozessorzeit von nur 20msec. zugeteilt kriege. Das programm selber besteht aus einem hauptthread, der beim Messen eh nur wartet(und somit keine Rechenzeit anfordert), und einem nebenthread zum Messen.
Um das hinzukriegen wollt ich halt die priorität des Prozesses auf REAL_TIME_PRIORITY_CLASS und die des Nebenthreads auf THREAD_PRIORITY_TIME_CRITICAL setzen.

Wisst ihr noch ein Tool, mit dem ich die pioritätsstufen der prozesse und deren Threads ermitteln kann und welche davon dann Zeit am CPU beantragen?
Gruß,
Borti

Tubos 15. Aug 2004 15:12

Re: Priorität von Prozessen ändern
 
Zitat:

also, ich schreib mir grad ein porgramm zum Erfassen von Messwerten. Das ganze muss natürlich kontinuierlich vor sich gehen und ich kann nicht drauf hoffen, dass ich ab und zu eine Prozessorzeit von nur 20msec. zugeteilt kriege

Ich bin mir nicht sicher, aber ich tippe mal auf soetwas wie MSDN-Library durchsuchenSetProcessPriority.

Beachte folgendes:
- Wenn sich dein Programm aufhängt musst du den Computer neustarten...es sei denn, du setzt die Delphi IDE auch auf Echtzeit.
- Das Programm kann dann nur mit Adminstratorrechten ausgeführt werden.
- Wenn dein Programm etwas zu rechnen hat und alle anderen Programme nicht, dann bekommt es automatisch die ganze Rechenleistung (ungefähr... ;) ) und nicht "ab und zu mal 20 ms".

Dazu noch eine Frage von mir an alle:
Sind die Zeitscheiben immer 22 ms lang oder können die auch unterschiedlich sein?

edit:
sry, habe deine Frage nicht ganz richtig verstanden.
Zitat:

Wisst ihr noch ein Tool, mit dem ich die pioritätsstufen der prozesse und deren Threads ermitteln kann und welche davon dann Zeit am CPU beantragen?
Der normale Windows Task-Manager!

Borti 15. Aug 2004 15:24

Re: Priorität von Prozessen ändern
 
Über die Konsequenzen mit dem Reset bin ich mir bewusst.

Aus neugier würd mich aber interessieren, was sonst noch so an Prozessen auf meinem System läuft un mitwelcher priorität. leider hab ich nur win98 und somit wird das bei mir nicht im taskmanager angezeit. bei dem Win32 taskmanagern ist darüber hinaus nur die Priorität der Prozesse zu erkennen nicht die der enthaltenen Threads. Daher hab ich nach einem Programm dafür gefragt.
Gruß,
Borti

Tubos 15. Aug 2004 15:29

Re: Priorität von Prozessen ändern
 
Windows 98? Ja, da gibts das nicht.
Und du brauchst auch keine Adminrechte zum Priorität erhöhen, weil es keine Benutzerrechte gibt ;)

Was sind das denn für Messdaten?
Und in welchem Intervall zeichnest du sie auf?

Borti 16. Aug 2004 19:55

Re: Priorität von Prozessen ändern
 
ich hab einen Wagen, der an diversen Lichtschranken vorbei fährt und ich muss geschwindigkeiten, beschleunigung etc. errechnen. Ich wollt dafür das best mögliche Intervall beim Aufzeichnen (20msec. ist fast schon zu lang)
ich hab schon mal rumprobiert und SetPriorityClass gibt mir den Wert false zurück!
Code:
Setpriorityclass(application.handle,HIGH_PRIORITY_CLASS)
What to do?
gruß,
Borti

Christian Seehase 16. Aug 2004 20:19

Re: Priorität von Prozessen ändern
 
Moin Borti,

Application.Handle ist das Handle des Hauptfensters der Anwendung, Du brauchst hingegen das Handle auf einen Prozess (OpenProcess).
Lies Dir am Besten noch mal die Dokumentation zu der Funktion genau durch.

Borti 19. Aug 2004 20:45

Re: Priorität von Prozessen ändern
 
Ich muss noch mal eure Hilfe in Anspruch nehmen. :lol:
soweit bin ich jetzt mit dem Code:
Code:
var H:Thandle;
begin
  H:=openprocess(PROCESS_SET_INFORMATION,false,dwProcessId);
  if not SetPriorityClass(H,REALTIME_PRIORITY_CLASS)
   then showmessage('Fehler!');
end;
Aber, was für setze ich für dwProcessId ein?
Danke,
Borti

DaFox 19. Aug 2004 21:48

Re: Priorität von Prozessen ändern
 
Hi.

In Deinem Fall ist das OpenProcess wohl witzlos, denke ich.

Schau' Dir mal GetCurrentProcess() an.
Wenn Du unbedingt die ProcessId haben willst, dann GetCurrentProcessId().

Gruß,
Markus

Tubos 19. Aug 2004 22:02

Re: Priorität von Prozessen ändern
 
Zitat:

Ich brauche für einen Thread meines programms den prozessor über einen Zeitraum von ein paar Minuten ohne Unterbrechung für mich alleine
Dazu eine Frage von mir:
Hat man dann wirklich 100% der CPU für sich?
Das System braucht doch auch Ressourcen!

Vjay 19. Aug 2004 23:02

Re: Priorität von Prozessen ändern
 
Windows ist kein Realtime-Betriebssystem.
Für deine Zwecke gibt es einige Unixe, denn du kannst nie sicherstellen dass du auf 100% cpu läufst, Interrupts erzeugen wie der Name schon sagt auch Verzögerungen.

Es ist unter windows absolut unmöglich 100% zeitnah zu arbeiten. Du könntest dies nur durch externe Hardware die die Werte zwischenspeichert erreichen. Ansonsten wird es dir durch Prioritätserhöhung nur gelingen dich einem Realtime - System anzunähern, aber du wirst es nicht erreichen können ;).

Vjay 19. Aug 2004 23:10

Re: Priorität von Prozessen ändern
 
Achja, nochwas au weia au weia. Deine Abfragefunktion, ob die Lichtschranke unterbrochen wurde erzeugt ja auch eine Verzögerung :-D + Das auslesen der Uhrzeit, die ja glaube ich auch auf 22msec ungenau ist.

Also denke mit Windows (98?!!) wird es das Beste sein den Thread auf Realtime zu setzen, und die Messung zwischen dem Unterbrechen der 2 Lichtschranken mehrmals durchzuführen. Denke dann wirst du einen guten Durchschnittswert erhalten.

Du hast ja schließlich eine Verzögerng bei der Start und bei der Ziel-Lichtschranke, das dürfte sich dann in der Summe aufheben.

Mfg
Vjay

Tubos 20. Aug 2004 14:09

Re: Priorität von Prozessen ändern
 
Zitat:

Windows ist kein Realtime-Betriebssystem.
Für deine Zwecke gibt es einige Unixe, denn du kannst nie sicherstellen dass du auf 100% cpu läufst, Interrupts erzeugen wie der Name schon sagt auch Verzögerungen.
Danke!

Zitat:

Deine Abfragefunktion, ob die Lichtschranke unterbrochen wurde erzeugt ja auch eine Verzögerung + Das auslesen der Uhrzeit, die ja glaube ich auch auf 22msec ungenau ist.
QueryPerformanceCounter, QueryPerformanceFrequency heißt die Lösung :)
außerdem:
Zitat:

ich hab einen Wagen, der an diversen Lichtschranken vorbei fährt und ich muss geschwindigkeiten, beschleunigung etc. errechnen
Wenn er beim Start und beim Ziel dieselbe Verzögerung hat, ist das kein Problem.
Doch wenn beim Start gerade eine winzige Unterbrechung (durchs System) ist, und beim Ziel keine, dann ist es wieder ungenau... :drunken:
Aber wofür braucht man bei einem Wagen, der an Lichtschranken vorbeifährt, eine Genauigkeit im ms-Bereich??

Borti 22. Aug 2004 20:04

Re: Priorität von Prozessen ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Das System braucht doch auch Ressourcen!
so, ich hab das ganze mal mit folgendem Code getestet:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var h1,h2:THandle;
    s:Tstrings;
    i:integer;
begin
  h1:=GetCurrentProcess;
  h2:=GetCurrentThread();
  if not SetPriorityClass(h1,REALTIME_PRIORITY_CLASS) then showmessage('Fehler!');
  if not SetThreadPriority(h2,THREAD_PRIORITY_TIME_CRITICAL) then showmessage('Fehler!');
  s:=TStringList.Create;
  for i:=0 to 1000000 do begin
   s.Add(inttostr(GetTickCount));
  end;
  s.SaveToFile('...\CPU-Test.txt');
  s.Free;
  Form1.Close;
end;
Die Datei CPU-Test.txt hab ich als Attachment angehängt. ich hab aber nur Abweichungen von 5msec. festgestellt. Eigentlich müssten es doch 22 sein!

Tubos 22. Aug 2004 20:59

Re: Priorität von Prozessen ändern
 
Zitat:

Die Datei CPU-Test.txt hab ich als Attachment angehängt. ich hab aber nur Abweichungen von 5msec. festgestellt. Eigentlich müssten es doch 22 sein!
GetTickCount liefert die ms seit Systemstart und hat eine Genauigkeit von 5 ms.
Das hat nichts mit den Prozessen und den 22-ms-Zeitscheiben zu tun.

Wieso willst du den Prozess eigentlich auf Echtzeit setzen, wenn du mit sowas ungenauem wie Gettickcount arbeitest?
edit:
achso, das war nur als test...ok

Borti 25. Aug 2004 17:21

Re: Priorität von Prozessen ändern
 
Aber, wenn mein thread kurz für einen anderen unterbrochen wird, dann müsste ich doch dann eine Lücke von 22msec. haben, oder?
Mit QueryPerformanceCounter ist das so eine Sache, da das Programm auch auf rRechnern mit Win32 laufen soll.
Gruß,
Borti

nailor 25. Aug 2004 17:26

Re: Priorität von Prozessen ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
datenkompression in aktion:

Borti 29. Aug 2004 09:57

Re: Priorität von Prozessen ändern
 
irgendwie versteh ich nicht, was du damit sagen willst. :gruebel:

himitsu 29. Aug 2004 10:18

Re: Priorität von Prozessen ändern
 
Er wollte nur mal auf die Dateigröße hinweisen.

Ein halbes MB für 'ne Zahlenkolonne ist doch übertrieben, wenns auch mit 99,9% weniger geht - die Modembenutzer würden sich doch über etwas weniger Transfervolumen freuen.

Tubos 29. Aug 2004 12:25

Re: Priorität von Prozessen ändern
 
Zitat:

Mit QueryPerformanceCounter ist das so eine Sache, da das Programm auch auf rRechnern mit Win32 laufen soll.
QueryPerformanceCounter ist doch Win32 ;)

Zitat:

Aber, wenn mein thread kurz für einen anderen unterbrochen wird, dann müsste ich doch dann eine Lücke von 22msec. haben, oder?
Achso, jetzt verstehe ich was du meinst...
Es gibt 2 Möglichkeiten:
a) Während deinem Test hat kein anderer Prozess was zum Rechnen gehabt
b) Dein Test wurde zwar von einem anderen Prozess unterbrochen, der hat aber sleep(0) aufgerufen und dadurch auf den Rest seiner Zeitscheibe verzichtet

Borti 30. Aug 2004 15:06

Re: Priorität von Prozessen ändern
 
Zitat:

QueryPerformanceCounter ist doch Win32
Laut OH aber nicht :coder2:
Code:
a) Während deinem Test hat kein anderer Prozess was zum Rechnen gehabt
b) Dein Test wurde zwar von einem anderen Prozess unterbrochen, der hat aber sleep(0) aufgerufen und dadurch auf den Rest seiner Zeitscheibe verzichtet
Bingo! genau das wollte ich wissen!:dancer:
kann ich nicht auch alle anderen Prozesse zum Verzichten ihrer Zeitscheiben zwingen?
Danke,
Borti

Tubos 30. Aug 2004 15:45

Re: Priorität von Prozessen ändern
 
Zitat:

kann ich nicht auch alle anderen Prozesse zum Verzichten ihrer Zeitscheiben zwingen?
Wie stellst du dir das vor?
Benütze die Priorität Echtzeit, dann hat dein Programm sicher die ganze CPU-Zeit - abgesehen vom Task-Scheduler, der eben kein Prozess ist ;)

franktron 30. Aug 2004 17:28

Re: Priorität von Prozessen ändern
 
@Barti also das mit der echtzeit unter Windows ist so eine sache.

1. Windows ist nicht echtzeitfähig (Momentan fählt mir nur DOS ein)
2. Auch bei Höster Prozess Prio klemmt sich windows ab und zu dazischen siehe 1.
3. Warum brauchst du echtzeit die meisten Messgeräte haben Puffer die die MS kompensieren.

Borti 2. Sep 2004 11:23

Re: Priorität von Prozessen ändern
 
Zitat:

a) Während deinem Test hat kein anderer Prozess was zum Rechnen gehabt
b) Dein Test wurde zwar von einem anderen Prozess unterbrochen, der hat aber sleep(0) aufgerufen und dadurch auf den Rest seiner Zeitscheibe verzichtet
Wie kann ich feststellen, was der Fall war?
Mich irritiert nämlich, dass ich in der Datei "CPU_Test.txt" ca. 200 mal die selbe GetTickCount-Zeit steht habe und dann plötzlich diese Sprünge von 5msec.! Wenn die Sprünge von der Ungenauigkeit von der function GetTickCount herrühren würden, dann müsste doch ein solcher Sprung zwischen jedem GetTickCount-Wert auftreten.
Woher habt ihr eigentlich das GetTickCount nur eine Genauigkeit von 5msec. leifert?
Gruß,
Borti


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