![]() |
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 |
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. |
Re: Priorität von Prozessen ändern
Vielleicht hilt dir das:
![]() Aber mich würde auch interessieren für was du das brauchst? |
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 |
Re: Priorität von Prozessen ändern
Zitat:
Ich bin mir nicht sicher, aber ich tippe mal auf soetwas wie ![]() 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:
|
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 |
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? |
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:
What to do?
Setpriorityclass(application.handle,HIGH_PRIORITY_CLASS)
gruß, Borti |
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. |
Re: Priorität von Prozessen ändern
Ich muss noch mal eure Hilfe in Anspruch nehmen. :lol:
soweit bin ich jetzt mit dem Code:
Code:
Aber, was für setze ich für dwProcessId ein?
var H:Thandle;
begin H:=openprocess(PROCESS_SET_INFORMATION,false,dwProcessId); if not SetPriorityClass(H,REALTIME_PRIORITY_CLASS) then showmessage('Fehler!'); end; Danke, Borti |
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 |
Re: Priorität von Prozessen ändern
Zitat:
Hat man dann wirklich 100% der CPU für sich? Das System braucht doch auch Ressourcen! |
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 ;). |
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 |
Re: Priorität von Prozessen ändern
Zitat:
Zitat:
außerdem: Zitat:
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?? |
Re: Priorität von Prozessen ändern
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Code:
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!
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; |
Re: Priorität von Prozessen ändern
Zitat:
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 |
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 |
Re: Priorität von Prozessen ändern
Liste der Anhänge anzeigen (Anzahl: 1)
datenkompression in aktion:
|
Re: Priorität von Prozessen ändern
irgendwie versteh ich nicht, was du damit sagen willst. :gruebel:
|
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. |
Re: Priorität von Prozessen ändern
Zitat:
Zitat:
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 |
Re: Priorität von Prozessen ändern
Zitat:
Code:
Bingo! genau das wollte ich wissen!:dancer:
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 kann ich nicht auch alle anderen Prozesse zum Verzichten ihrer Zeitscheiben zwingen? Danke, Borti |
Re: Priorität von Prozessen ändern
Zitat:
Benütze die Priorität Echtzeit, dann hat dein Programm sicher die ganze CPU-Zeit - abgesehen vom Task-Scheduler, der eben kein Prozess ist ;) |
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. |
Re: Priorität von Prozessen ändern
Zitat:
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