AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TJvTimer

Ein Thema von Luckner · begonnen am 4. Okt 2016 · letzter Beitrag vom 5. Okt 2016
Antwort Antwort
Seite 1 von 3  1 23      
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#1

TJvTimer

  Alt 4. Okt 2016, 15:12
Datenbank: Firebird • Version: 2.1 • Zugriff über: Dataset
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:
procedure TFramePlannung.TimerPlanungTimer(Sender: TObject);
begin
  DatamodulePlannung.DataModule5.IBDataSetGridPlannung.Close;
  Datamodule5.IBDatabasePlannung.DatabaseName := dbpfad;
  DatamodulePlannung.DataModule5.IBDataSetGridPlannung.Open;
end;
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;
DatamodulePlannung.DataModule5.IBDataSetGridPlannu ng.Close;
mache, dann bekommen ich eine leere Tabelle. Woran kann es liegen, dass die Daten nicht aktualisiert werden.
Danke, Luckner
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: TJvTimer

  Alt 4. Okt 2016, 15:38
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.



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.
$2B or not $2B
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#3

AW: TJvTimer

  Alt 4. Okt 2016, 15:38
Zitat:
Das TJvTimer-Event wird standardmäßig in einem Thread ausgeführt.
Muss dafür Threaded nicht auf True stehen? Ich meine es steht standardmäßig auf False, oder?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TJvTimer

  Alt 4. Okt 2016, 15:41
Hab den schon lange nicht mehr genutzt, aber schnell nochmal nachgeguckt und die Doku meint auch True.
http://wiki.delphi-jedi.org/wiki/JVC...Timer.Threaded
$2B or not $2B
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#5

AW: TJvTimer

  Alt 4. Okt 2016, 15:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: TJvTimer

  Alt 4. Okt 2016, 16:02
Nee nee, wenn Threaded=True, dann läuft das Event in einem Thread.
Und wenn False, dann wird intern sowieso TTimer verwendet.


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.
$2B or not $2B
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#7

AW: TJvTimer

  Alt 4. Okt 2016, 16:07
Zitat:
Wenn die Anfrage "länger" dauert, dann wäre ein Thread schon OK, ABER die VCL darf von dem Thread garnichts mitbekommen
Ich spreche in meinen Threads ständig die VLC an und hatte bisher noch nie Probleme.
Wie sonst soll man einen Fortschrittsbalken steuern?
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: TJvTimer

  Alt 4. Okt 2016, 16:44
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: TJvTimer

  Alt 4. Okt 2016, 16:47
Zitat:
Wenn die Anfrage "länger" dauert, dann wäre ein Thread schon OK, ABER die VCL darf von dem Thread garnichts mitbekommen
Ich spreche in meinen Threads ständig die VLC an und hatte bisher noch nie Probleme.
Wie sonst soll man einen Fortschrittsbalken steuern?
Du kannst schon mit deiner GUI aus einem Thread "sprechen". Aber du musst die Aufrufe vorher mit Synchronize() oder Queue() synchronisieren. Aus Threads würde ich aber immer ein Event feuern anstatt direkt darauf zuzugreifen. Das Event handled dann alles was es soll. Und ein Event muss dann auch mit Sychronize(OnFinish) aufgerufen werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: TJvTimer

  Alt 4. Okt 2016, 16:56
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)


Wie sonst soll man einen Fortschrittsbalken steuern?
TThread.Synchronize, TThread.Queue, threadsichere Listen, Windows-Messages oder ähnliches.
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.
$2B or not $2B

Geändert von himitsu ( 4. Okt 2016 um 16:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.
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