![]() |
Timer ohne Form mehrfach - nur Fehler ....
Moin zusammen !
Ich bastle hier an einer DLL für ein Programm, in welcher Hardware abgefragt und gesteuert wird. Die DLL betseht aus mehreren Units, jeweils mit einer eigenen Klasse - u.a. auch aus einem Logger in dem ich einen Timer ohne Form erzeuge, also in der Klasse. Das funktioniert so weit tadellos - den Logger benutze ich auch sonst in meiner weiteren Proggerei. Nun ergab sich das Prob, das ich aus einen Hardwaretreiber etwas auslesen muss - allerdings muss ich das pollen, weil es keinen Event gibt. Auch nicht tragisch, mache ich auch dort einen Timer (exakt das gleiche wie im Logger), der zyklisch alle 200mS max 50x eine Funktion abfragt, bis gewünschte Werte vorhanden oder auch eben nicht. Jetzt kommt das Problem ! So bald ich im Constructor besagter Unit/Klasse Zitat:
Ich kann mir da absolut keinen Reim drauf machen. Hat jemand ne Idee ? |
AW: Timer ohne Form mehrfach - nur Fehler ....
Zitat:
|
AW: Timer ohne Form mehrfach - nur Fehler ....
Hauptsächlich Speicherzugriffsfehler. Kann nicht lesen Wert von Adresse ....
Dann von der Applikation (welche die DLL nutzt) noch so einiges undefiniertes (Eigene Meldung, nicht WinDoof). Es erweckt den Anschein, als wenn auf eine nicht erzeugt variable zugegriffen wird. So was ähnliches kann ich auch provozieren, in dem ich LOG := TLOG.Create; mal bewusst vergesse und dann zig LOG-Aufrufe kommen ... Interessanterweise wie gesagt auch schon, wenn ich nur FCI_Timer erzeuge. Der Timer selbst wird noch gar nicht gestartet, bzw. es erfolgt noch kein Zugriff auch die On-Timer-Routine. (die ist auch völlig leergeklammert) Mittlerweile habe ich auch alle möglichen Funktions-Aufrufe der Klasse DDAPI (so heisst das Ding, wo auch der 2 Timer gestartet/erzeugt wird) in der DLL ausgeklammert. Es wird nur DDAPI := TDDAPI.Create; ausgeführt. Im Constructor stehen nach inherited Create; auch sonst nur intern wertmäßig zu definierende Variablen. ... und der Aufruf. s. o. Ich progge schon viele Jahre mit Delphi, aber so was hatte ich noch nicht. |
AW: Timer ohne Form mehrfach - nur Fehler ....
Nachtrag:
Zu diesem Thema findet man ja nicht nur hier etwas. Allerdings liest man einerseits "Ja, geht auch ohne Form" (tuts ja anscheinend auch) und andererseits wird da so was wie ein Dummy-Fenster dazugebasltet. Bei letzterem bezieht man sich darauf, das ja eine WIndoof-Botschaft irgendwo bleiben muss. Welche ? In einem normalen Fenster wird doch auch nur die Ereignisfunktion aufgerufen .... oder ist da noch mehr zu beachten ? Jetzt muss ich natürlich hier auch noch erwähnen, das die Logger-Klasse zwar ein Fenster besitzt, dieses aber nur bei Bedarf erzeugt wird und mit dem Timer eigentlich so keinen "Kontakt" hat - ausser das beide Variablen in der Klasse definiert sind. Das sieht so aus (Auszug):
Delphi-Quellcode:
SetLogWin(true/false) prüft, ob das Fenster bereits erzeugt wurde oder nicht und öffnet/schliesst es.
....
type TLOGWIN = class(TForm) lb_LOG : TListBox; cb_W2Log : TCheckBox; cb_AOT : TCheckBox; BitBtn2 : TBitBtn; procedure BitBtn2Click(Sender: TObject); private public published end; TLOG = class private protected .... FLogTimer : TTimer; // internal timer to read from list FLOGWIN : TLOGWIN; // the Logger-Window ..... procedure SetLogWin(Mode : boolean); procedure SetLogFile(Mode : boolean); procedure OnTimer(Sender: TObject); public constructor Create(APath, AName : string; WinShow, FileLog, WriteOver : boolean); destructor Destroy; override; ..... published .... end; constructor TLOG.Create(APath, AName : string; WinShow, FileLog, WriteOver : boolean); //var // AppPath : string; begin inherited Create; .... FShowWin := WinShow; // default: yes/no by calling application // init Timer FLogTimer := TTimer.Create(nil); FLogTimer.Enabled := false; FLogTimer.Interval := 250; FLogTimer.OnTimer := OnTimer; // now initalize window and / or filewriter SetLogWin(FShowWin); // creats/opens window, if true SetLogFile(FLogFile); // opens file, if true FLogTimer.Enabled := true; end; destructor TLOG.Destroy; begin .... SetLogWin(false); // closes window, if open if Assigned(FLOGWIN) then FLOGWIN.Free; .... FLogTimer.Free; .... inherited destroy; end; In OnTimer werden zwischenzeitlich in einer Liste aufgelaufene LOG-Texte je nach Einstellung des Loggers am Stück in die ListBox des Fensters geschoben (sofern erzeugt) oder in eine Textdatei geschrieben. Es passiert also m.M.n. nichts absonderliches in diesem kleinen Tool - es funzt ja auch schon in div Appls bei mir seit langer Zeit. In der DDAPI-Klasse sieht es nahezu genauso aus - nur keine Form dabei:
Delphi-Quellcode:
In CamMenu_Poll steht momentan nix drin.
....
type .... TDDAPI = class private protected .... FCI_Timer : TTimer; procedure CamMenu_Poll(Sender: TObject); procedure _LOG(S1, S2 : string); public constructor Create; destructor Destroy; override; .... published .... end; implementation uses SysUtils, Logger; // hier binde ich den Logger ein ! procedure TDDAPI._LOG(S1, S2 : string); begin if Assigned(LOG) then LOG.Log('DDAPI', S1, S2); // Text an Logger in die Liste end; constructor TDDAPI.Create; begin inherited Create; .... FCI_Timer := TTimer.Create(nil); // Hier fliegt alles aus der Kurve ..... FCI_Timer.Enabled := false; FCI_Timer.Interval := 100; FCI_Timer.OnTimer := CamMenu_Poll; end; destructor TDDAPI.Destroy; begin .... FCI_Timer.Free; inherited destroy; end; Noch ein Nachtrag: Nun habe ich in die DDAPI-Klasse auch noch so ein Fenster wie im Logger (ein leeres) eingebaut. .... leider keine Änderung - alos hat es, wie ich es mir dachte, damit nix zu tun. |
AW: Timer ohne Form mehrfach - nur Fehler ....
Ein neues Posting:
Ich habe nun den Standard-Timer "eleminiert" und durch den Multimedia-Timer ersetzt. ![]() Was soll ich sagen ? Funktioniert (bisher) tadellos ! Nichtsdestotrotz hätte ich gerne gewusst, warum das mit dem Standard-Timer ohne Form nicht ein 2. Mal (und noch öfter) nicht klappt. |
AW: Timer ohne Form mehrfach - nur Fehler ....
Hilft Dir
![]() |
AW: Timer ohne Form mehrfach - nur Fehler ....
Das kannte ich schon - nein, leider nicht.
|
AW: Timer ohne Form mehrfach - nur Fehler ....
Niemand eine Idee / Erklärung ?
|
AW: Timer ohne Form mehrfach - nur Fehler ....
Zumindest eine Idee
Problemstellen bei der Verwendung von VCL-Komponenten in der DLL: Die DLL sollte den Speichermanager der Anwendung mit benutzen, dazu muss der eigene Speichermanager entsprechend konfiguriert werden. Die Variable "Application" muss in der DLL auf die selbe Instanz verweisen wie im eigentlichen Programm. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 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-2025 by Thomas Breitkreuz