![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: Dataset
TJvTimer
Hallo,
ich habe eine DBGrid, das über ein Dataset mit einer Tabelle verbunden ist. Dann existiert ein TJvTimer. Das Interval ist eingestellt auf 30000. Folgender Code:
Delphi-Quellcode:
Theoretisch müsste sich der Inhalt des DBGrids ändern (falls sich die Einträge in der Tabelle geändert haben) Es tut sich jedoch nichts. Der TJvTimer funktioniert jedoch, weil wenn ich nur;
procedure TFramePlannung.TimerPlanungTimer(Sender: TObject);
begin DatamodulePlannung.DataModule5.IBDataSetGridPlannung.Close; Datamodule5.IBDatabasePlannung.DatabaseName := dbpfad; DatamodulePlannung.DataModule5.IBDataSetGridPlannung.Open; end; DatamodulePlannung.DataModule5.IBDataSetGridPlannu ng.Close; mache, dann bekommen ich eine leere Tabelle. Woran kann es liegen, dass die Daten nicht aktualisiert werden. Danke, Luckner |
AW: TJvTimer
Das TJvTimer-Event wird standardmäßig in einem Thread ausgeführt.
Und dafür, dass du unsynchronisiert auf die VCL zugreifst, wirst du vollkommen zu Recht mit Fehlverhalten bestraft. :warn: DataSet.DisableControls und EnableContols im Haupthtread eventuell auch/alternativ die DataSource vom Grid abhängen und dann kann man das DataSet gern in einem Thread aktualisieren Alternativ im Thread ein neues DataSet holen und das danach dann im Hauptthread schnell umhängen. |
AW: TJvTimer
Zitat:
|
AW: TJvTimer
Hab den schon lange nicht mehr genutzt, aber schnell nochmal nachgeguckt und die Doku meint auch True.
![]() |
AW: TJvTimer
Aber wenn der auf True ist, läuft er doch im Hauptthread und synchronisiert alles.
So ist jedenfalls mein Kenntnisstand. Ich würde aber eh auf den TTimer umstellen. TJvTimer bringt hier keinerlei Vorteil. |
AW: TJvTimer
Nee nee, wenn Threaded=True, dann läuft das Event in einem Thread.
Und wenn False, dann wird intern sowieso TTimer verwendet. :stupid: Wenn die Anfrage "länger" dauert, dann wäre ein Thread schon OK, ABER die VCL darf von dem Thread garnichts mitbekommen und natürlich auch die DB-Connection muß mit Threads klar kommen. |
AW: TJvTimer
Zitat:
Wie sonst soll man einen Fortschrittsbalken steuern? |
AW: TJvTimer
Habe jetzt einiges ausprobiert aber leider ohne Erfolg. Was mich wundert, dass wenn ich das Dataset.close setze, dann ist das Grid leer. Also reagiert die VCL auf den Timer. Ich muß mal schauen, ob das Grid (auch von Jedi) nicht irgendeinen Cache hat.
|
AW: TJvTimer
Zitat:
|
AW: TJvTimer
Die VCL ist per se nicht threadsave, daher darf man niemals unsynchronisert darauf zugreifen, da es immer zu Problemen kommen kann.
Einiges der VCL nutzt ausschließlich Messages (nur ein SendMessage in der Methode ... dann synchronisiert sich das "zufällig" von selber) Zitat:
Oder aucg Events im Thread setzen und in der VCL (z.B. Timer) reagiert jemand da drauf und liest das Ergebnis synchronisiert aus, wenn er Zeit hat. SendMessage der besser PostMessage ... 'ne ProgressBar ist ja auch nur 'nen Windows-Control und da kennt die WinAPI eine pasende Message, um das zu steuern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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