Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi nonVCL Timer (https://www.delphipraxis.net/119644-nonvcl-timer.html)

XXcD 29. Aug 2008 01:01


nonVCL Timer
 
Hallo,
ich hatte vorhin gefragt wie ich eine TList fülle und jetzt habe ich schon wieder ein Problem das dann auch einzusetzen.

Ich müsste alle 30 Sekunden diese Liste aktualisieren, nun dachte ich mir nehme ich mal ein Timer, aber das ist nicht so einfach wie ich dachte.

Ich habe es erst so versucht:
Delphi-Quellcode:
procedure TSQL.reloadaccs(o: Tobject);
var ex: boolean;
    q: string;
    I:Integer;
    Account : TAccounts;
begin
SQL.ListAccounts:= TList.Create;
if assigned(SQL.FResult) then begin
    if SQL.FMysql.Status<>MYSQL_STATUS_READY then
      WriteLog('Ein Ergebnis wurde unvollständig gelesen!', true);
      FreeAndNil(SQL.FResult);
  end;
  q:='select * from user;';
  SQL.FResult := SQL.FMysql.query(q, true, ex);
  if ex then
  begin
    SQL.ListAccounts.Clear;
    SQL.FResult.First;
   for I := 0 to SQL.FResult.RowsCount - 1 do
   begin
    Account:= TAccounts.Create;
    Account.ID      := strtoint(SQL.Fresult.FieldValuebyname('id'));
    SQL.ListAccounts.Add(Account);
   SQL.FResult.Next;
   end;
  end;
end;
...
  SQL.Timer:= TTimer.Create(nil);
  SQL.Timer.Interval:=30000;
  SQL.Timer.OnTimer := SQL.reloadaccs;
  SQL.Timer.Enabled:=true;
die Funktion reloadaccs wird aber garnicht ausgeührt, danach habe ich in der DP folgendes gefunden:
Delphi-Quellcode:
Type
    ToTimerHandler = class(Tobject)
        constructor create (nMs: integer);
        private
        FoT: Ttimer;
        procedure timerCall(o: Tobject);
        end;

Procedure ToTimerHandler.timerCall(o: Tobject);
Begin
    FoT.Enabled := True;
    writeln;
    writeln;
    write ('Test......');
    qDone := False;
End;

...
begin
ToTimerHandler.create(30000);
end.
Da wird der Code aber nur ausgeführt wenn ich das so habe:
Delphi-Quellcode:
...
begin
ToTimerHandler.create(30000);
while true do
begin
Application.Processmessage;
end;
end.
Dadurch wird aber der Rest des Programms nicht mehr weiter ausgefüht.
Wie könnte ich jetzt einfach einen Timer benutzen, der den Rest des Programms nicht blockiert?

spaxxn 29. Aug 2008 09:32

Re: nonVCL Timer
 
Wenn der Timer-Event startet, könntest du einen Thread abfeuern, der die Arbeit in einem Kindprozess erledigt.

Zu Threads gibt es bei Delphi im Demo-Verzeichnis ein kleines Beispiel.

turboPASCAL 29. Aug 2008 10:45

Re: nonVCL Timer
 
Zitat:

nonVCL Timer
Und TStringlist, TTimer etc. gehören IMHO zur VCL.


Zitat:

Zitat von spaxxn
Wenn der Timer-Event startet, könntest du einen Thread abfeuern, der die Arbeit in einem Kindprozess erledigt.

Zu Threads gibt es bei Delphi im Demo-Verzeichnis ein kleines Beispiel.

Ist wohl die beste Möglichkeit.

Bernhard Geyer 29. Aug 2008 10:54

Re: nonVCL Timer
 
Zitat:

Zitat von turboPASCAL
Zitat:

nonVCL Timer
Und TStringlist, TTimer etc. gehören IMHO zur VCL.

Delphi-Quellcode:
Application.Processmessage;
Damit ist dann 95% der VCL eingebunden :-)

spaxxn 29. Aug 2008 11:10

Re: nonVCL Timer
 
:stupid:

Luckie 29. Aug 2008 11:32

Re: nonVCL Timer
 
Ich sehe nicht wo das etwa smit nonVCL zu tun hat. Es wird ja anscheinend ein Timer der SQL-Komponente benutzt.

XXcD 31. Aug 2008 23:43

Re: nonVCL Timer
 
Kann mir bitte einer Code für einen Timer in der Console geben?
Ich versuche es jetzt schon seid tagen und komme einfach nicht weiter.

lbccaleb 1. Sep 2008 00:24

Re: nonVCL Timer
 
Das was du benutzt ist doch kein nonVCL! Du hast doch ne Komponente benutzt! Wenn du nur auf API-Funktionen zurückgreifen möchtest, dann schau dir die API-Tutorials von Luckie an! Die sollten dir dort weiter helfen..

Hier das Dokument von Ihm:

API-Tutorials

Und hier noch Sampels und andere Bsp.:

Samples

XXcD 1. Sep 2008 01:06

Re: nonVCL Timer
 
nö funktioniert damit auch nicht.
Gib mir doch bitte einfach den richtigen Code um einen Timer in einem Konsolenprogramm zu verwenden.
Das was bei Luckie dabei ist, erzeugt ja ein Fenster und das ist ja wieder was ganz anderes.

hathor 1. Sep 2008 08:11

Re: nonVCL Timer
 
In einer DLL habe ich das mal so realisiert:
.
http://msdn.microsoft.com/en-us/library/ms644906.aspx
.
Delphi-Quellcode:
procedure TimerProc(Wnd:HWnd;Msg,TimerID,dwTime:DWORD);stdcall;
Begin
//das, was regelmäßig geschehen soll
end;


SetTimer(0,0,1000,@TimerProc) //1000 msec

Klaus01 1. Sep 2008 09:06

Re: nonVCL Timer
 
Zitat:

Zitat von XXcD
Kann mir bitte einer Code für einen Timer in der Console geben?
Ich versuche es jetzt schon seid tagen und komme einfach nicht weiter.

Guten Morgen,

wie Du einen Timer in einer Consolenanwendung benutzt wird hier beschrieben.

Grüße
Klaus

Luckie 1. Sep 2008 09:22

Re: nonVCL Timer
 
Oder hier mit der Timer-Komponente: http://www.michael-puff.de/Developer...n_Konsole.html

gammatester 1. Sep 2008 09:39

Re: nonVCL Timer
 
Zitat:

Zitat von Luckie
Oder hier mit der Timer-Komponente: http://www.michael-puff.de/Developer...n_Konsole.html

Wird da nicht etwas geschummelt? :wink: In der Schleife wird ja manuell NotifyEvent(p, T) aufgerufen. Wird das auskommentiert, gibt es zumindest unter Win98 keine Event-Kontrollausgabe.

Gammatester

Luckie 1. Sep 2008 09:46

Re: nonVCL Timer
 
Kommentier die Zeile aus und guck es dir an. ;)

gammatester 1. Sep 2008 10:05

Re: nonVCL Timer
 
Zitat:

Zitat von Luckie
Kommentier die Zeile aus und guck es dir an. ;)

Das habe ich ja gemacht bevor ich gefragt habe:
Code:
C:\TMP>Project2.exe
Warte auf Event:
warte 500ms...
warte 1000ms...
warte 1500ms...
warte 2000ms...
warte 2500ms...
C:\TMP>
Das ist die Ausgabe, wenn die Zeile auskommentiert ist, sonst sieht man die "yes" und hört die "beeps":
Code:
Warte auf Event:
warte 500ms...
yes
warte 1000ms...
yes
warte 1500ms...
yes
warte 2000ms...
yes
warte 2500ms...
yes
Allerdings würde ich vielmehr "yes" erwarten: Je eins manuell, und dann jeweils alle 200ms. Wie sieht's denn bei Dir aus?

Gammatester

Luckie 1. Sep 2008 10:56

Re: nonVCL Timer
 
Hm, komisch, irgendwas stimmt da wirklich nicht. Ist aber auch schon älter der Code und ich weiß gar nicht, ob er ursprünglich von mir ist.

XXcD 1. Sep 2008 12:27

Re: nonVCL Timer
 
Ich mache das jetzt mit diesem Link http://www.delphipraxis.net/internal...=502712#502712
Da funktioniert die Lösung mit dem Thread

lbccaleb 1. Sep 2008 13:21

Re: nonVCL Timer
 
Das ist doch quasi das was auch Luckie in seinen Tutorials erklärt! :gruebel:

smallsmoker 1. Sep 2008 13:49

Re: nonVCL Timer
 
Zitat:

Zitat von lbccaleb
Das ist doch quasi das was auch Luckie in seinen Tutorials erklärt! :gruebel:

@lbccaleb: wundert dich das wenn jemand schon vorher so einen kommentar abgegeben hat:

Zitat:

Gib mir doch bitte einfach den richtigen Code[..]
mfg smallsmoker

XXcD 1. Sep 2008 13:55

Re: nonVCL Timer
 
ne Luckie hat mit Messages gearbeitet und ich habe keine Ahnung wie ich in eine Konsolenanwendung die Messages abfangen kann.

Und jetzt habe ich es so gemacht:
Delphi-Quellcode:
function reloadaccs(Parameter: Pointer): integer;
begin
repeat
USQL.ladeaccounts(nil);
sleep(30000);
until false;
end;
...
BeginThread(nil, 0, reloadaccs, nil, 0, ThreadID);
Das hat ja garnichts mit Luckies version zu tun.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 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