Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Priorität einer Anwendung (https://www.delphipraxis.net/41692-prioritaet-einer-anwendung.html)

runger 7. Mär 2005 12:46


Priorität einer Anwendung
 
Hallo,

wir möchten Echtzeitanwendungen schreiben und benötigen dafür eine Programm, das alle anderen Prioritätsmaässig übertrifft.
Wie kann man das realisieren.

Rainer

himitsu 7. Mär 2005 12:52

Re: Priorität einer Anwendung
 
[dp]echtzeit*[/dp]

z.B.
Priorität von Prozessen ändern
Priorität einer Anwendung << blöder Beispiellink -.-''

Aber was das "Echtzeit" angeht .. hier gibt es auch schon einige Diskusionen dazu ... ist auf dem Meisten Rechneren/Betriebssystemen nicht möglich ;)

trifid 7. Mär 2005 12:55

Re: Priorität einer Anwendung
 
Wahrscheinlich habt ihr es dann auch mit Thread's zu tun ...
Dann einfach mit der SetThreadPriority die Priorität einstufen.

runger 7. Mär 2005 13:28

Re: Priorität einer Anwendung
 
Hallo,

ich weiss nicht ob ich chinesisch rede, aber ich will die Priorität meiner eigenen Anwendung ändern und zwar zur Laufzeit.
Keine Threads oder sonstiges.

Rainer

Matze 7. Mär 2005 13:33

Re: Priorität einer Anwendung
 
Ermittel den Prozess und stelle die Priorität folgendermaßen ein:

Delphi-Referenz durchsuchenSetPriorityClass

Btw: Dein Umgangston ist immer gleich so aggresiv, das muss nicht sein. :)

himitsu 7. Mär 2005 13:35

Re: Priorität einer Anwendung
 
Und wie wäre es dann damit?

Die Suche liefert oftmals überraschende Ergebnisse :warn:

[dp]priorität, anwendung[/dp]

>> die Priorität des Haupt-Threads(eigener Anwendung) ändern?
>> höhere Priorität einer Anwendung



PS: Matze + "Umgangston" = rechthaben (ich stimme ihm ja sooo selten zu ^^)

Luckie 7. Mär 2005 14:38

Re: Priorität einer Anwendung
 
Zitat:

Zitat von runger
ich weiss nicht ob ich chinesisch rede, aber ich will die Priorität meiner eigenen Anwendung ändern und zwar zur Laufzeit.
Keine Threads oder sonstiges.

Du redest nicht chinesisch nur verstehst du die Antworten nicht. Ein Prozess ist nichts weiter als ein Container. Er stellt nur den Adressraum bereit. Ein Prozess führt keinen Code aus, das tuen Threads. Wurde ein Prozess gestartet, der Adressraum eingerichten und noch verschiedene andere Dinge initialisiert, dann wird mit CreateThread der Primärethread gestartet, der dann den tatsächlichen Programmcode ausführt. Da ein Prozess keinen Code ausführt, kann man dessen Priorität auch nicht ändern, sondern man kann nur die Priorität der Threads verändern.

MSDN-Library durchsuchenSetPriorityClass verändert zwar die Priorität des Prozesses aber nur durch ändern der Prioritäten der einzelnen Threads innerhalb eines Prozesses:
Zitat:

The SetPriorityClass function sets the priority class for the specified process. This value together with the priority value of each thread of the process determines each thread's base priority level.
Wenn dir also gesagt wurde, wie du die Priorität eines Threads änderst, war das die korrekte Antwort auf deine Frage.

Wo und wie soll das Programm denn zum Einsatz kommen? Du solltest ber+ücksichtigen dass die Prioritätsklasse REALTIME_PRIORITY_CLASS das System so ziemlich unbrauchbar macht und noch nicht mal mehr der Taskmanager zur Not aufgerufen werden kann im schlimmsten Fall.

trifid 7. Mär 2005 15:44

Re: Priorität einer Anwendung
 
@runger,
zu meiner Verteidigung :-D möcht ich nur sagen :
Wenn jemand eine professionelle
Zitat:

Echtzeitanwendung
entwicklen möchte, kommt er um Threads nicht herum. :!:
Das
Zitat:

chinesische
fängt erst damit an, wenn wirklich unter Windows Echtzeit-Datenverarbeitung betrieben wird. :!:

runger 8. Mär 2005 06:32

Re: Priorität einer Anwendung
 
Lieber Luckie,

ich hatte gefragt wie man zur Laufzeit die Priorität des eigenen laufenden Prozesses ändern kann.
Genauer:
Wir benutzen einen Timer, der sekündlich läuft, um einen Rundsteuertagesfahrplan (was das ist kann ich dir privat erklären) auszuwerten!
Das heisst: jede Sekunde wird nachgeschaut ob im Tagesfahrplan ein Eintrag mit der aktuellen Uhrzeit steht.
Unser Problem besteht darin, dass wenn auf dem Rechner ein zweites oder drittes Programnm läuft, der Timer verspätet ausgelöst wird und damit die aktuelle Sekunde bereits verstrichen ist. Eine Auslagerung in einen separaten Thread kommt aus anderen Gründen nicht in Frage.

Bemerkung: Mir ist schon öfter aufgefallen, dass du sehr persönliche (und auch verletzende)Antworten verteilst. Lass das bitte.

Rainer

alcaeus 8. Mär 2005 07:33

Re: Priorität einer Anwendung
 
Zitat:

Zitat von runger
ich hatte gefragt wie man zur Laufzeit die Priorität des eigenen laufenden Prozesses ändern kann.

In dem du die Priorität des ersten Threads deines Prozesses mit SetPriorityClass veränderst. Einen Thread gibts immer, das hat Luckie wohl erklärt.

Zitat:

Zitat von runger
Genauer:
Wir benutzen einen Timer, der sekündlich läuft, um einen Rundsteuertagesfahrplan (was das ist kann ich dir privat erklären) auszuwerten!
Das heisst: jede Sekunde wird nachgeschaut ob im Tagesfahrplan ein Eintrag mit der aktuellen Uhrzeit steht.
Unser Problem besteht darin, dass wenn auf dem Rechner ein zweites oder drittes Programnm läuft, der Timer verspätet ausgelöst wird und damit die aktuelle Sekunde bereits verstrichen ist. Eine Auslagerung in einen separaten Thread kommt aus anderen Gründen nicht in Frage.

Ihr könntet versuchen, den Timer zu messen, d.h. die erste Minute mit 1 Sek. Verzögerung arbeiten, und die Zeit messen die der Timer durchschnittlich verfehlt hat. Anschließend zieht ihr die Zeit vom Intervall ab, und fertig.

Zitat:

Zitat von runger
Bemerkung: Mir ist schon öfter aufgefallen, dass du sehr persönliche (und auch verletzende)Antworten verteilst. Lass das bitte.

Abgesehen von der Tatsache, dass sowas eher in eine PN gehört, will ich mal ein Zitat werfen:
Zitat:

ich weiss nicht ob ich chinesisch rede, aber ich will die Priorität meiner eigenen Anwendung ändern und zwar zur Laufzeit.
Keine Threads oder sonstiges.
Deine Antworten sind auch nicht gerade das was ich freundlich nenne, vor allem wenn man bedenkt, dass du dich mit der Materie wahrscheinlich nicht auseinandergesetzt hast. Sonst wüsstest du dass jeder Prozess mind. einen Thread hat, und deshalb SetPriorityClass durchaus eine Lösung ist. JM2C

Greetz
alcaeus

trifid 8. Mär 2005 09:30

Re: Priorität einer Anwendung
 
@runger,

Zitat:

Wir benutzen einen Timer, der sekündlich läuft, ... auszuwerten!
Was ist daran "ECHTZEIT" :!: :!: :!:

Zitat:

Das heisst: jede Sekunde wird nachgeschaut ob im Tagesfahrplan ein Eintrag mit der aktuellen Uhrzeit steht.
Wenn das mal kein Ereignis ist. :wink:
Wer erzeugt den Eintrag im Tagesfahrplan. Und wo (Medium (( Datenbank, Arbeitsspeicher, Hardware-Schnittstelle)) ) wird es eingetragen.

Zitat:

Unser Problem besteht darin, dass wenn auf dem Rechner ein zweites oder drittes Programnm läuft,
der Timer verspätet ausgelöst wird und damit die aktuelle Sekunde bereits verstrichen ist.
Dafür würde ich nie und nimmer den TTimer verwenden.
Schau mal im google Bei Google suchenwindows echtzeit kernel

Zitat:

Eine Auslagerung in einen separaten Thread kommt aus anderen Gründen nicht in Frage.
Das muss man einfach respektieren, wenn man die Gründe kennt. ;-)
Ansonsten kann man es nur tolerieren.

Zitat:

Bemerkung: Mir ist schon öfter aufgefallen, dass du sehr persönliche (und auch verletzende)Antworten verteilst. Lass das bitte.
Das tut hier nichts zur Sache, und kann auch nicht als "verletzend" bewertet werden, was Luckie versucht hat dir zu erklären.
Viel schlimmer ist dein Zitat "Ich weiss was ich kann! Du auch?" ... und dann erzählst du was von Echtzeit im Sekundentakt :gruebel:

Sprint 8. Mär 2005 09:46

Re: Priorität einer Anwendung
 
Zitat:

Zitat von Luckie
Da ein Prozess keinen Code ausführt, kann man dessen Priorität auch nicht ändern, sondern man kann nur die Priorität der Threads verändern.

Selbstverständlich kann man die Priorität eines Prozess ändern.

runger 8. Mär 2005 10:24

Re: Priorität einer Anwendung
 
Hallo,

das Problem hat sich erledigt!
SetPriorityClass(GetCurrentProcess,DWORD(THREAD_PR IORITY_IDLE));

Diesen Befehl in oncreate oder onshow des ersten Fensters fertig.

Rainer

An himutsu: vielen Dank! Dein beitrag hat mich weiter gebracht. Ist halt nicht immer so ganz einfach mit der Sucherei!

himitsu 8. Mär 2005 10:36

Re: Priorität einer Anwendung
 
Also, wenn das so ist, dann last doch
a: das Programm in einer Schleife laufen, oder
b: stellt den Timer auf 20 ms ein (ist so das Kleinste, was TTimer kann)
(b ist dabei ja auch sowas wie eine Schleife ^^)

Delphi-Quellcode:
var MerkeZeit: irgendeinIntegertyp := 0;


Repeat // die Schleife ... oder Begin der Timerprozedur
  If MerkeZeit = AktuelleZeit Then Countinue; // oder Exit, bei der Prozedure
  MerkeZeit := AktuelleZeit;

  ... was auch immer (etwa Sekündlich)

Until ; // die Schleife ... oder End der Timerprozedur

Wenn Zeiten ni´ch in Sekunden vorhanden sind, dann muß halt entsprechend scaliert werden

z.B. Zeiten in Millisekunden:
Delphi-Quellcode:
  If MerkeZeit = AktuelleZeit div 1000 Then Countinue; // oder Exit, bei der Prozedure
  MerkeZeit := AktuelleZeit div 1000;



Wenn die Schleife also oftgenug aufgerufen wird, dann ist die Chance geringer, dass etwas verpasst wird.



Oder ihr macht es so, wie bisher, aber merkt euch die letzte Zeit, als euer Code ausgeführt wurde, wenn ihr dann das mit der aktuellen Zeit vergleicht, wisst ihr ja, wieviele der "letzten" Sekunden noch bearbeitet werden müssen, somit wird auch nichts vergessen.

Wie gesagt, Echtzeit gibt es bei Windows nicht und ihr müßt immer mal damit rechnen, dass mal euer Programm ein bissl ins stocken kommt.

[edit]
wieso ist der Beitrag nicht das 1. Mal eingefügt wurde? (zum Glück war alles nochim Speicher -.-'' )

[]
Bitte bitte ... manchmal sieht man halt den Wald vor Bäumen nicht ;)

Luckie 8. Mär 2005 11:33

Re: Priorität einer Anwendung
 
Zitat:

Zitat von Sprint
Zitat:

Zitat von Luckie
Da ein Prozess keinen Code ausführt, kann man dessen Priorität auch nicht ändern, sondern man kann nur die Priorität der Threads verändern.

Selbstverständlich kann man die Priorität eines Prozess ändern.

ja war etwas blöd ausgedrückt. Die Priorität eies Prozesses ergibt sich aus den Prioritäten von dessen Threads. Ändere ich die Basispriorität der Threads innerhalb des Prozesses, dann wird natürlich auch die Priorität des Prozesses geändert. Und mit MSDN-Library durchsuchenSetPriorityClass wird eben die Basisprioritöt der Threads geändert.

Zitat:

Zitat von runger
ich hatte gefragt wie man zur Laufzeit die Priorität des eigenen laufenden Prozesses ändern kann.

Und genau das haben dir alle beantwortet.

Zitat:

Das heisst: jede Sekunde wird nachgeschaut ob im Tagesfahrplan ein Eintrag mit der aktuellen Uhrzeit steht.
Autsch. Das würde ich nicht mit einem Timer lösen. Wenn ich eine Einfluss auf die andere Anwendung hätte, dann würde ich immer eine Nachricht verschicken und mit der anderen Anwendung eben empfangen und immer wenn eine ankommt entsprechend reagieren.
Oder ich würde einen separaten Thread nehmen (Es würde mich ziemlich interessieren, warum das bei dir nicht geht.), denn ich immer mit Sleep(1000) lahmlege. Aber einen Timer würde ich auf keinen Fall nehmen.

Windows ist nachrichtenbasierend und kann so mit nie ein Echtzeitsystem sein. Selbst wenn du die Priorität deines Prozesses hochsetzt.

Delphi-Quellcode:
SetPriorityClass(GetCurrentProcess,DWORD(THREAD_PRIORITY_IDLE));
Der Cast nach DWORD ist überflüssig, THREAD_PRIORITY_IDLE ist bereits ein DWORD. Aber kannst du mir mal erklären, was du da machst? Die Prioritätsklassen für die API Funktion sind:
Zitat:

  • ABOVE_NORMAL_PRIORITY_CLASS
    Process that has priority above NORMAL_PRIORITY_CLASS but below HIGH_PRIORITY_CLASS.
    Windows NT and Windows Me/98/95: This value is not supported.
  • BELOW_NORMAL_PRIORITY_CLASS
    Process that has priority above IDLE_PRIORITY_CLASS but below NORMAL_PRIORITY_CLASS.
    Windows NT and Windows Me/98/95: This value is not supported.
  • HIGH_PRIORITY_CLASS
    Process that performs time-critical tasks that must be executed immediately. The threads of the process preempt the threads of normal or idle priority class processes. An example is the Task List, which must respond quickly when called by the user, regardless of the load on the operating system. Use extreme care when using the high-priority class, because a high-priority class application can use nearly all available CPU time.
  • IDLE_PRIORITY_CLASS
    Process whose threads run only when the system is idle. The threads of the process are preempted by the threads of any process running in a higher priority class. An example is a screen saver. The idle-priority class is inherited by child processes.
  • NORMAL_PRIORITY_CLASS
    Process with no special scheduling needs.
  • REALTIME_PRIORITY_CLASS
    Process that has the highest possible priority. The threads of the process preempt the threads of all other processes, including operating system processes performing important tasks. For example, a real-time process that executes for more than a very brief interval can cause disk caches not to flush or cause the mouse to be unresponsive.

Die Konstanten, die du angegeben hast, gilt für MSDN-Library durchsuchenSetThreadPriority. Hast du mal im Taskmanger geguckt mit was für einer Priorität dein Prozess jetzt läuft? Außerdem dachte ich, du wolltest die Priorität hoch setzten. Jetzt hast du aber genau das Gegenteil gemacht. Dein Thread / Prozess bekommt jetzt nur noch Rechenzeit, wenn im System "nicht los ist". Bzw:
Zitat:

Zitat von PSDK
For IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS, and HIGH_PRIORITY_CLASS processes, the system dynamically boosts a thread's base priority level when events occur that are important to the thread.

Ich würde dir dazu mal empfehlen, mein Thread-Tutorial durch zu lesen.

Zitat:

Zitat von runger
Bemerkung: Mir ist schon öfter aufgefallen, dass du sehr persönliche (und auch verletzende)Antworten verteilst. Lass das bitte.

Ach? Ich zitiere dich mal: "Red' ich chinesisch...". Im Gegensatz dazu war mein Beitrag ohne jegliche Gefühlsäußerung. Das einzige, was ich geamcht habe, ich habe gesagt,
Zitat:

Du redest nicht chinesisch nur verstehst du die Antworten nicht.
Weil hättest du die Antworten verstanden, dann wäre dieser Satz von dir überflüssig gewesen.

runger 8. Mär 2005 11:42

Re: Priorität einer Anwendung
 
Hallo Luckie,

bitte lies meine Frage durch und die Antworten die ihr gegeben habt.

Dies hätte voll und ganz genügt:
SetPriorityClass(GetCurrentProcess,DWORD(THREAD_PR IORITY_IDLE));

(oder einen link darauf)

himatsu hat das gekonnt!

Rainer

Luckie 8. Mär 2005 11:50

Re: Priorität einer Anwendung
 
Zitat:

Zitat von runger
Dies hätte voll und ganz genügt:
SetPriorityClass(GetCurrentProcess,DWORD(THREAD_PR IORITY_IDLE));

(oder einen link darauf)

Und genau das hat himitsu gleich im ersten Posting gemacht. Also genau das was, du wolltest. Nur du warst wohl nicht in der Lage, dich mal länger als 10 Sekunden mit den Links zu beschäftigen.

Geschlossen, alles weitere per PN.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 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 by Thomas Breitkreuz