![]() |
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:
die Funktion reloadaccs wird aber garnicht ausgeührt, danach habe ich in der DP folgendes gefunden:
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;
Delphi-Quellcode:
Da wird der Code aber nur ausgeführt wenn ich das so habe:
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.
Delphi-Quellcode:
Dadurch wird aber der Rest des Programms nicht mehr weiter ausgefüht.
...
begin ToTimerHandler.create(30000); while true do begin Application.Processmessage; end; end. Wie könnte ich jetzt einfach einen Timer benutzen, der den Rest des Programms nicht blockiert? |
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. |
Re: nonVCL Timer
Zitat:
Zitat:
|
Re: nonVCL Timer
Zitat:
Delphi-Quellcode:
Damit ist dann 95% der VCL eingebunden :-)
Application.Processmessage;
|
Re: nonVCL Timer
:stupid:
|
Re: nonVCL Timer
Ich sehe nicht wo das etwa smit nonVCL zu tun hat. Es wird ja anscheinend ein Timer der SQL-Komponente benutzt.
|
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. |
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: ![]() Und hier noch Sampels und andere Bsp.: ![]() |
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. |
Re: nonVCL Timer
In einer DLL habe ich das mal so realisiert:
. ![]() .
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 |
Re: nonVCL Timer
Zitat:
wie Du einen Timer in einer Consolenanwendung benutzt wird ![]() Grüße Klaus |
Re: nonVCL Timer
Oder hier mit der Timer-Komponente:
![]() |
Re: nonVCL Timer
Zitat:
Gammatester |
Re: nonVCL Timer
Kommentier die Zeile aus und guck es dir an. ;)
|
Re: nonVCL Timer
Zitat:
Code:
Das ist die Ausgabe, wenn die Zeile auskommentiert ist, sonst sieht man die "yes" und hört die "beeps":
C:\TMP>Project2.exe
Warte auf Event: warte 500ms... warte 1000ms... warte 1500ms... warte 2000ms... warte 2500ms... C:\TMP>
Code:
Allerdings würde ich vielmehr "yes" erwarten: Je eins manuell, und dann jeweils alle 200ms. Wie sieht's denn bei Dir aus?
Warte auf Event:
warte 500ms... yes warte 1000ms... yes warte 1500ms... yes warte 2000ms... yes warte 2500ms... yes Gammatester |
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.
|
Re: nonVCL Timer
Ich mache das jetzt mit diesem Link
![]() Da funktioniert die Lösung mit dem Thread |
Re: nonVCL Timer
Das ist doch quasi das was auch Luckie in seinen Tutorials erklärt! :gruebel:
|
Re: nonVCL Timer
Zitat:
Zitat:
|
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:
Das hat ja garnichts mit Luckies version zu tun.
function reloadaccs(Parameter: Pointer): integer;
begin repeat USQL.ladeaccounts(nil); sleep(30000); until false; end; ... BeginThread(nil, 0, reloadaccs, nil, 0, ThreadID); |
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