AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Timer ohne Form mehrfach - nur Fehler ....

Timer ohne Form mehrfach - nur Fehler ....

Ein Thema von TERWI · begonnen am 5. Mai 2013 · letzter Beitrag vom 8. Mai 2013
Antwort Antwort
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#1

Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 09:28
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:
FCI_Timer := TTimer.Create(nil);
aufrufe, hagelt es hier von Fehlermeldungen vershiedenster Art ! So ca. 80-90 Stück.

Ich kann mir da absolut keinen Reim drauf machen.
Hat jemand ne Idee ?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.977 Beiträge
 
Delphi 12 Athens
 
#2

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 09:33
So bald ich im Constructor besagter Unit/Klasse
Zitat:
FCI_Timer := TTimer.Create(nil);
aufrufe, hagelt es hier von Fehlermeldungen vershiedenster Art ! So ca. 80-90 Stück.
Ich weiß, die Frage muss dir komisch vorkommen, aber welche Fehlermeldungen kommen denn?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 10:39
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.

Geändert von TERWI ( 5. Mai 2013 um 11:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 12:36
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:
....
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;
SetLogWin(true/false) prüft, ob das Fenster bereits erzeugt wurde oder nicht und öffnet/schliesst es.

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:
....
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;
In CamMenu_Poll steht momentan nix drin.


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.

Geändert von TERWI ( 5. Mai 2013 um 13:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 14:13
Ein neues Posting:

Ich habe nun den Standard-Timer "eleminiert" und durch den Multimedia-Timer ersetzt.
Einfaches Beispiel siehe hier
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.

Geändert von TERWI ( 5. Mai 2013 um 14:15 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#6

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 18:17
Hilft Dir das weiter?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 5. Mai 2013, 19:03
Das kannte ich schon - nein, leider nicht.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
378 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 8. Mai 2013, 09:35
Niemand eine Idee / Erklärung ?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Timer ohne Form mehrfach - nur Fehler ....

  Alt 8. Mai 2013, 11:03
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:34 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