Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   timer (https://www.delphipraxis.net/154526-timer.html)

arcon 14. Sep 2010 13:51

timer
 
servus miteinander,

ich würde gerne folgendes problem lösen :

ich überwache zyklisch ein programm. dabei soll bei jedem durchlauf der programmüberwachung in eine prozedur 'timer' gesprungen werden .. und überprüft werden , ob der timer schon abgelaufen ist .. ist der timer bereits abgelaufen, soll ein mail-versand stattfinden und der timer wieder auf den startwert gesetzt werden. ist der timer noch nicht abgelaufen, soll wieder aus der timer-prozedur herausgesprungen werden und die zyklische programmüberwachung fortgesetzt werden.

jetzt zu meiner frage: ist ein timer für diese realisierung sinnvoll und vor allem .. geht das nicht an die ressourcen ?

weiterhin wäre ich für ein kleines beispielprogramm sehr dankbar, die einen timer realisert .. (man muss evtl. dazu sagen, dass ich keine komponenten aus der toolpalette verwenden darf.. muss alles handgeschrieben sein ! )

danke für eure tipps

gruß arcon

MacGuyver 14. Sep 2010 14:01

AW: timer
 
Moin,

ist das eine Konsolenanwendung? Die Standardkomponenten sind doch so rudimentär...

Sonst frage einfach GetTickCount ab. Du bekommst damit einen Wert in Millisekungen seit Start des Rechners. Nur nach 45 Tagen sollte so langsam der Rechner neu gestartet werden.


Stefan

arcon 14. Sep 2010 14:07

AW: timer
 
jepp .. ist eine konsolenanwendung ..

und was man noch sagen sollte .. dass diese anwendung auf einem server laufen wird..

danke erstmal -- werd mich mal erkundigen ..

arcon 14. Sep 2010 14:13

AW: timer
 
noch ne frage ..

der timer muss ja immer durch laufen .. und das programm muss ja weiter laufen.. egal ob der timer durch ist oder nicht .. deswegen müsste ich das doch in extra thread darstellen oder ?

wenn ja.. wie mach ich das ganze ?

danke für die tipps

MacGuyver 14. Sep 2010 14:46

AW: timer
 
Ich habe mein DOS-Programm (TP 7.0) in Delphi konvertiert. Ich kann es jetzt unter TP 7.0 und TurboDelphi kompilieren. Oh, ich wollte doch immernoch die Konvertierung veröffentlichen. Mal sehen, ob ich das heute abend eben mach.
Vom Thema abgekommen. In der Tastaturabfrage habe ich einfach alle Funktionen eingeschliffen. Wird keine Taste gedrückt, dann kommen die anderen Sachen dran. Externe Geräte, Abfrage ob der Bildschirmschoner starten muss, Kommunikation mit den anderen Stationen im Netz.

Bleibt die Frage, musst du da mit Freds agieren?

arcon 14. Sep 2010 15:02

AW: timer
 
ich muss jedenfalls einen timer programmieren, der es mir ermöglicht .. unabhängig vom hauptprogramm .. die zeit herunterzuzählen .. dabei soll das hauptprogramm in seiner fkt. nicht beeinträchtigt oder schlafen gelegt werden .. da das hauptprogramm ja ständig in nem bestimmten zyklusinterverall das "programm" überwachen soll ..

deswegen wäre ein fred besser ..

arcon 14. Sep 2010 15:31

AW: timer
 
ich habe folgenden code im web gefunden .. jedoch habe ich damit meine probleme ...

Code:
type
  // die Demo-Thread-Timer-Klasse
  TTimerThread = class(TThread)
  private
    FID: Integer;     // ID des Threads
    FTimeout: Integer; // Laufzeit in Millisekunden
    FStep: Integer;   // Schrittweite in Millisekunden
    FLog: TStrings;   // Ausgaben hier anfügen
    FLogLine: String; // Zeile, die synchronisiert angefügt werden soll
  protected
    procedure SyncLogLineAdd; // synchronisierte Anfügemethode
    procedure LogIt(const S: String); // interne Logausgabe
  public
    // neues Objekt anlegen, beschreibende Werte direkt übergeben
    constructor Create(const AID, ATimeout, AStep: Integer; // s.o.
      const ALog: TStrings; // s.o.
      const AOnTerminate: TNotifyEvent); // beim Ende aufrufen (synchronisiert)
    procedure Execute; override; // hier wird gearbeitet -> also gewartet... ;)
  end;

 
implementation

 
// ----------------------------------------------------------------------------- 
// TTimerThread
 
constructor TTimerThread.Create(const AID, ATimeout, AStep: Integer;
  const ALog: TStrings; const AOnTerminate: TNotifyEvent);
begin
  inherited Create(TRUE); // gestoppt erzeugen
  // Werte übernehmen
  FID := AID;
  FTimeout := ATimeout;
  FStep := AStep;
  FLog := ALog;
  OnTerminate := AOnTerminate;
  FreeOnTerminate := TRUE;
  if Assigned(FLog) then // der Konstruktor läuft im Hauptthread, direkt ausgeben
    FLog.Add('+++Thread(ID:'+IntToStr(FID)+', Timeout:'+IntToStr(FTimeout)+'ms, Step:'+IntToStr(FStep)+'ms) erzeugt.');
  Resume; // los gehts! 
end;

 
procedure TTimerThread.Execute;
begin
  while ( (FTimeout >= 0) // solange der Timer noch nicht abgelaufen ist
          and             // und
          (NOT Terminated) // der Thread noch laufen soll
        ) do begin
    LogIt('  Thread '+IntToStr(FID)+': noch '+IntToStr(FTimeout)+'ms...');
    Sleep(FStep); // nur den Thread schlafen legen - die Anwendung blockiert nicht! 
    Dec(FTimeout,FStep); // Auszeit anpassen
  end;
  LogIt('---Thread '+IntToStr(FID)+': beendet.');
end;

 
// interne Logausgabe (synchronisiert) machen
procedure TTimerThread.LogIt(const S: String);
begin
  FLogLine := S; // die Ausgabe puffern
  Synchronize(SyncLogLineAdd); // und synchronisiert in Log schreiben
end;

 
// Methode, um synchronisiert eine Logzeile zu schreiben
procedure TTimerThread.SyncLogLineAdd;
begin
  if Assigned(FLog) then
    FLog.Add(FLogLine); // gepufferte Zeile ausgeben (jetzt im Hauptthread!)
end;
das ganze habe ich auf
http://www.delphi-library.de/viewtopic.php?p=463391
gefunden.

kann mir jemand erklären, wie und wo ich das ereignis hinschreiben muss, sobald der timer abgelaufen ist ?

MacGuyver 14. Sep 2010 16:02

AW: timer
 
Wie verschickst du die Mails?

Wenn das nur Sekundensache ist, kannst du doch eine Mail verschicken und dann die Tastatur abfragen. Sind alle Mails verschickt, startet der Timer neu.

Ich habe sonstetwas in meiner Tastaturabfrage drin und das Teil läuft gut: Blinkende Symbole, Modem-Verbedienung (nur der DOS-Bildschirm, habe ich wieder rausgeschmissen weil ich das nicht brauche), Schriftzüge die Blinken, Anzeige der Personalkosten, Anzeige der derzeitigen Lieferzeit, usw.

Bis jetzt hat sich kein Kunde beschwert, wenn es mal etwas träger ist.

arcon 15. Sep 2010 07:23

AW: timer
 
die mails versende ich einmal am tag ... und das mach ich über die funktion 'JFSendMail' die es über das internet kostenlos gibt .. und sehr gut funktioniert !

mal ne andere frage .. wenn ich in nem neuen projekt auf einer form die funktion ttimer aus der produktpalette installiere.. funktioniert das wie gewollt ..

wie kann ich den das ganze in einen sourcecode umschreiben, so dass das dann auch funktioniert ? wisst ihr wie ich das meine ?

gruß arcon

arcon 15. Sep 2010 08:15

AW: timer
 
ich habe mal folgenden code gefunden gehabt ..

aber es gibt dabei leider kleine komplikationen ...

vielleicht könnt ihr mir dabei helfen !

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  ExtCtrls;

type
  PMethodPointer = ^TMethodPointer;
  TMethodPointer = packed record
    pMethod: Pointer;
    pObject: TObject;
  end;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  T: TTimer;
  p: TMethodPointer;
  i: Integer;
implementation

{$R *.dfm}
 procedure NotifyEvent(Self: TMethodPointer; Sender: TObject);
begin
  writeln('yes');
  beep;
end;

begin
  T := TTimer.Create(nil);
  T.Interval := 2000; // -> löst alle 200 ms das OnTimer-Event aus
  try
    p.pMethod := @NotifyEvent;
    p.pObject := nil;
    T.OnTimer := TNotifyEvent(p);

    T.Enabled := true; // aktiviert den Timer
    writeln('Warte auf Event: '); <------ Hier tritt der FEHLER auf !
    for i := 1 to 5 do begin
      sleep(500);
      writeln('warte ' + inttostr(i*500) + 'ms...');
      NotifyEvent(p, T);
    end;
    T.Enabled := false; // deaktiviert den Timer
  finally
    T.Free;
  end;
end.
der fehler sagt aus : Im Projekt Project1.exe ist eine Exception der Klasse EInOutError mit der Meldung 'E/A-Fehler-105' aufgetreten.

kann mir jemand evtl. weiterhelfen, was ich falsch mache ?

danke !


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr.
Seite 1 von 2  1 2      

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