![]() |
Befehl immer wieder ausführen ohne CPU belastung
Hallo
Ich schreibe immoment ein Programm das einen Befehl immer wieder ausführen soll. Es soll ein anderes Programm immer im Vordergrund halten. Klappt auch nur ist die CPU belastung relativ hoch weil ich es halt alle 50 Milisekunden wiederholen lasse. Gibt es da ne bessere variante? Außerdem kann ich den (Sender=Butto2) nicht in die while Schleife direkt setzen, warum geht das nicht? Code:
Delphi-Quellcode:
Danke schonmal in voraus
var
fHandle: HWND; i:integer; begin fHandle := FindWindow('notepad', nil); if fHandle <> 0 then begin i:=0; while i=0 do begin if Sender = Button2 then i:=1; delay(50); SetForeGroundWindow(fHandle); end; end; end; |
AW: Befehl immer wieder ausführen ohne CPU belastung
Hallo und Willkommen in der DP :dp:,
würdest Du den Code bitte in Delphi-Tags einschließen? Dann ist er für andere besser zu lesen. Und was meinst Du mit in die Schleife setzen? Ist die Routine eine Methode oder eine reguläre Funktion/Prozedur? |
AW: Befehl immer wieder ausführen ohne CPU belastung
Übrigens: wenn du das Notepad alle 50ms nach Vorne bringst werden Dich alle Benutzer hassen,
die gerade etwas anderes tun möchten (z.B. EMail lesen, im Internet surfen). :evil: Der Benutzer will die Kontrolle haben, welches Fenster gerade oben ist; wenn das nicht nach seinem Willen läuft wird er stinkig. |
AW: Befehl immer wieder ausführen ohne CPU belastung
Bist Du aber kleinlich :mrgreen:
|
AW: Befehl immer wieder ausführen ohne CPU belastung
folgender Code erzeugt bei mir keine Last, über Sinn und Unsinn kann man streiten.
Delphi-Quellcode:
procedure TForm5.Timer1Timer(Sender: TObject);
var fHandle: HWND; i:integer; begin fHandle := FindWindow('notepad', nil); if fHandle <> 0 then begin i:=0; while i=0 do begin if Sender = Button2 then i:=1; Application.ProcessMessages; sleep(50); if GetForeGroundWindow <> fHandle then SetForeGroundWindow(fHandle); end; end; end; |
AW: Befehl immer wieder ausführen ohne CPU belastung
Delphi-Quellcode:
Der Sender kann sich niemals einfach so innerhalb des Funktionsaufrufs verändern.
if Sender = Button2 then
Wenn der Timer weiterläuft, dann wird über Application.ProcessMessages immer wieder eine neue "Instanz" von Timer1Timer gestartet, welche niemals enden wird (Endlosschleife) Da aber immer mehr Prozeduren gesartet werden, wird dieses Unweigerlich irgendwann in einem Stacküberlauf enden müssen. Wozu überhaupt diese Schleife?
Delphi-Quellcode:
Timer1.Intervall auf 50 eingestellt und du hast das selbe Ergebnis, aber ohne das Stackproblem.
procedure TForm5.Timer1Timer(Sender: TObject);
var fHandle: HWND; begin fHandle := FindWindow('notepad', nil); if (fHandle <> 0) and (GetForeGroundWindow <> fHandle) then SetForeGroundWindow(fHandle); end; PS: Warum ein rießiger Integer i, wo dieser doch nur wie ein Boolean verwendet wird? |
AW: Befehl immer wieder ausführen ohne CPU belastung
Wozu i?
Hmm, wie schreibt man Endlosschleifen, "while true"? Unnötig, hier ist goto gefordert. :lol:
Delphi-Quellcode:
Obs performanter ohne Abfragebedingun ist? :gruebel:
var fHandle: HWND;
label ComeFrom; begin fHandle := FindWindow('notepad', nil); if fHandle <> 0 then begin if Sender<>btn1 then Exit; ComeFrom: Application.ProcessMessages; sleep(50); if GetForeGroundWindow <> fHandle then SetForeGroundWindow(fHandle); goto ComeFrom; end; |
AW: Befehl immer wieder ausführen ohne CPU belastung
Zitat:
:? PS: Ich denke nicht, dass es performanter ist ;) Im Zweifelsfall wird der gleiche Assemblercode erzeugt wie bei der while-true Schleife. |
AW: Befehl immer wieder ausführen ohne CPU belastung
Gescheiter wäre es, die stayontop Eigenschaft des entsprechenden Objekts zu setzen, wenn es nur um die Sichtbarkeit geht. Dem Anwender alle 50ms den Focus wegzunehmen, kann doch nicht die Absicht sein?
Um sich beliebige Fenster im Vordergrund sichtbar zu halten, gibt es übrigens die Freeware Deskpins. |
AW: Befehl immer wieder ausführen ohne CPU belastung
Hey
Also um das mal klarzustellen. Es geht nicht um Notepad das war nur um es zu testen^^ Es geht um nen Flugsimulator. Das Problem dort ist, wenn man ihn im Fenstermodus laufen lässt (was für meine Anwendung nicht anders geht) dann geht der Sound sofort weg wenn man wo anders hinklickt, deshalb wollte ich halt etwas haben was ihn im Vordergrund hält oder bzw dann sofort wieder zurück bringt wenn man wo anders hingeklickt hat. Mit Deskpins geht leider nicht, das Fenster bleibt zwar im Vordergrund aber leider nicht aktiv :-( -> Sound geht aus Und ich wollt das halt mit einem Button aktivieren und mit nem anderen abbrechen. Habs jetzt so gemacht:
Delphi-Quellcode:
Gibts da ne einfachere möglichkeit? Problem ist bei 50ms oder 100ms muss man schon öfter drücken bis der befehl durchkommt :-P
procedure TForm1.Button1Click(Sender: TObject);
begin Timer1.Enabled:=True; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:=False; end; Vlt geht das mit dem Sound ja auch anders???? Danke für die Antworten ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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