Entwickler-Ecke

Windows API - ständige Überwachung


Clemens - Di 02.08.05 09:59
Titel: ständige Überwachung
Hallöchen,

ich brauchte eine Prozedur/Funktion, die ständig etwas überwacht. Sollte ohne den Timer sein.

Hat an so was gedact.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Loop;
var b:Boolean;

begin

b:=true;

while b=true do begin


end;

...




allerdings hängt sich das Programm dann ja immer auf. :twisted: Gibt es da was anderes. Bei der nonVCL
gibt's das für die Nachrichten ja irgenwie auch und es klappt
ja auch.


Delphi-Quelltext
1:
2:
3:
4:
while GetMessage(msg,0,0,0do
  begin
    DispatchMessage(msg);
  end;




P.S. gibts irgendwo nen schnelleren Timer?

Danke


Heiko - Di 02.08.05 10:01

Timer sidn alle realtiv schnell. Die Frage ist wofür du es brauchst (also wie groß der Rhytmus sein muss). Aso und in deiner while-do-Schleife musst du noch Application.Processmessages einbauen, damit man nicht denkt, dass das Programm abgeschmiert ist.


Tino - Di 02.08.05 10:03
Titel: Re: ständige Überwachung
user profile iconClemens hat folgendes geschrieben:
allerdings hängt sich das Programm dann ja immer auf.

Wie kommst du darauf, dass sich das Programm aufhängt?

Versuche mal in der Loop "Schleife" Application.ProcessMessages aufzurufen. Dann werden die Fensternachrichten auch verarbeitet.

Gruß
Tino

EDIT: Upps.. war wohl etwas zu langsam ;-)


Heiko - Di 02.08.05 10:06

@Clemens: Wenn Windows meldet, das er keine Rückmeldung hat, bedeutet das nur, dass das Programm auf Nutzerreaktionen nicht reagiert, es heißt nicht, dass das Programm abgeschmiert ist.


Clemens - Di 02.08.05 10:12

Vielen Dank,
jetzt klappts. Das einzige Problem ist das ich
das Programm nicht über den X-Button oben rechts beenden kann.
(Minimieren,bewegen... geht)
Muss ich da die Schleife erst beenden? Und was ist wenn ich
die für ganz viele Objektinstanzen deklariere, schluckt das dann viele Systemressourcen?


Udontknow - Di 02.08.05 10:13

Hallo!

Deine Schleife muß auf "not Application.Terminated" prüfen (btw: Für Endlosschleifen reicht ein "while true do ...").

PS: Bin mir gerade nicht sicher, ob dort schon Application.Terminated true ist... *Grübel*

Cu,
Udontknow


Heiko - Di 02.08.05 10:14

Problem beenden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var Beenden: Boolean=false

procedur xyz;
begin
 while true do
  begin
   if Beenden then break;
   Application.ProcessMessages
  end;
end;

procedure TForm1.FormClose(Sender: TObjekt);
begin
 Beenden:=true
end;


Clemens - Di 02.08.05 10:16

Muss ich gleich mal ausprobieren. :D

Thanks



Wiekönnte ich das denn jetzt so verändern, dass er so wie der
Timer in einem bestimmten Zeitintervall immer prüft, sagen wir
mal jede Millisekunde ein Mal?


rochus - Di 02.08.05 10:40

Hi!
Ich hab gerade keine direkte Antwort auf deine Frage, aber eventuell könnte es helfen, wenn du sagst, was du überwachen möchtest. Wenn du nämlich irgendwelche Systemeinträge kontrollieren möchtest, könntest du auch eventuell über WMI und WMI-Events an die Veränderungen rankommen.

Gruß
Nicolai


Clemens - Di 02.08.05 10:54

Hi,
ich möchte überwachen ob der Mauszeiger auf einer ImageSprite gedrückt wird. Da habe ich nämlich auch schon ein neues Problem: man kann von oben genennter Funktion irgendwie nur eine beginnen. Bei mir müsste jedoch jede Instanz sich selber überwachen, sprich braucht einen eigenen Methodenaufruf.
Wenn ich jedoch die zweite Sprite erzeuge wird die Loop-Funktion von der ersten Sprite beendet.

Hoffe du/ihr weißt/wisst was


uall@ogc - Di 02.08.05 10:58


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
function schleife(p: integer): integer;
begin
  while true do
  begin
    // mach was
    sleep(100);
  end;
end;


procedure TForm1.OnCreate(Sender: TObject); // oder wann mans braucht
var tid: cardinal;
begin
  BeginThread(nil,0,@schleife,nil,0,tid);
end;


// für Textbildschirmanwendung

var tid: cardinal;
begin
  BeginThread(nil,0,@schleife,nil,0,tid);
  while true do readln;
end.