Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Befehl immer wieder ausführen ohne CPU belastung (https://www.delphipraxis.net/152605-befehl-immer-wieder-ausfuehren-ohne-cpu-belastung.html)

BlueLiquidCell 29. Jun 2010 13:03


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:
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;
Danke schonmal in voraus

DeddyH 29. Jun 2010 13:12

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?

shmia 29. Jun 2010 14:19

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.

DeddyH 29. Jun 2010 14:24

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Bist Du aber kleinlich :mrgreen:

Bummi 29. Jun 2010 14:27

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;

himitsu 29. Jun 2010 14:37

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Delphi-Quellcode:
if Sender = Button2 then
Der Sender kann sich niemals einfach so innerhalb des Funktionsaufrufs verändern.
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:
procedure TForm5.Timer1Timer(Sender: TObject);
var
    fHandle: HWND;
begin
    fHandle := FindWindow('notepad', nil);
    if (fHandle <> 0) and (GetForeGroundWindow <> fHandle) then
        SetForeGroundWindow(fHandle);
end;
Timer1.Intervall auf 50 eingestellt und du hast das selbe Ergebnis, aber ohne das Stackproblem.

PS: Warum ein rießiger Integer i, wo dieser doch nur wie ein Boolean verwendet wird?

mleyen 29. Jun 2010 14:38

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:
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;
Obs performanter ohne Abfragebedingun ist? :gruebel:

Neutral General 29. Jun 2010 14:41

AW: Befehl immer wieder ausführen ohne CPU belastung
 
Zitat:

Zitat von mleyen (Beitrag 1032331)
Wozu i?
Hmm, wie schreibt man Endlosschleifen, "while true"? Unnötig, hier ist goto gefordert. :lol:

Auf ihn mit Gebrüll! :evil:
:?

PS: Ich denke nicht, dass es performanter ist ;) Im Zweifelsfall wird der gleiche Assemblercode erzeugt wie bei der while-true Schleife.

idefix2 29. Jun 2010 15:02

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.

BlueLiquidCell 29. Jun 2010 15:23

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
end;
Gibts da ne einfachere möglichkeit? Problem ist bei 50ms oder 100ms muss man schon öfter drücken bis der befehl durchkommt :-P

Vlt geht das mit dem Sound ja auch anders????

Danke für die Antworten ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz