AGB  ·  Datenschutz  ·  Impressum  







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

Zeitabhängige Ereignisse auslösen

Ein Thema von markon · begonnen am 30. Okt 2003 · letzter Beitrag vom 17. Nov 2003
Antwort Antwort
markon

Registriert seit: 12. Sep 2003
229 Beiträge
 
#1

Zeitabhängige Ereignisse auslösen

  Alt 30. Okt 2003, 17:38
hallo.
brauch mal ne anregung zum programmieren.

muss einen fahrplan programmieren, der zu bestimmten zeitpunkten bestimmte ereignisse auslöst.
werde um einen oder mehrere timer nicht drumrum kommen..
hat jemand schon mal sowas programmiert?!
wenn ja, wie kann man das angehen, mit welchen komponenten?!

gruß
marcus
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Zeitabhängige Ereignisse auslösen

  Alt 30. Okt 2003, 18:09
Moin Marcus,

Du könntest dafür einfach TTimer verwenden, oder Du erzeugst einen Thread, in dem Du mit Hilfe eines Dummy Events (Hier im Forum suchenCreateEvent in Regelmässigen Abständen nachschaust, ob der gewünschte Zeitpunkt eingetreten ist.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#3

Re: Zeitabhängige Ereignisse auslösen

  Alt 30. Okt 2003, 20:26
Hi,

vieleicht hilft dir ja das weiter

mit
MyTimerThread := TTimerThread.Create( OneSecProc ); wird alle sec die OneSecProc gerufen

mit
MyTimerThread := TTimerThread.Create( XXXX, Proc ); wird alle XXXX ms die Proc gerufen

mit
MyTimerThread.Enabled := False; kannst du ihn auch mal anhalten.

mit
MyTimerThread.Stop; beseitigt sich der "Timer-Thread" von allein



Delphi-Quellcode:
unit cl_Thread;

interface
  uses Windows, Classes, syncobjs, Sysutils;

type

  TTimerThread = class(TThread)
  private
    { Private-Deklarationen }
    FEnabled : Boolean;
    FOneSec : Boolean;
    FOnNotify : TNotifyEvent;
    FInterval : Longint;
    FTag : Longint;
    FCloseEvent : TSimpleEvent;
    FEnableEvent : TSimpleEvent;
    FLastSec : Word;
  public
    constructor Create( OnNotify: TNotifyEvent ); overload;
    constructor Create( aInterval: Longint; OnNotify: TNotifyEvent ); overload;
    destructor Destroy; override;
    procedure Stop;
  protected
    procedure Execute; override;
    procedure Notify;
    procedure SetEnabled( Value: Boolean );
    procedure SetInterval( Value: Longint );
  published
    property Interval: Longint read FInterval write SetInterval;
    property Enabled : Boolean read FEnabled write SetEnabled;
    property Tag : Longint read FTag write FTag;
  end;

implementation

constructor TTimerThread.Create( OnNotify: TNotifyEvent );
begin
  inherited Create( True );
  FreeOnTerminate := True;
  FOnNotify := OnNotify;
  FInterval := 50;
  FCloseEvent := TSimpleEvent.Create;
  FEnableEvent := TSimpleEvent.Create;
  FEnabled := True;
  FOneSec := True;
  Resume;
end;

constructor TTimerThread.Create( aInterval: Longint; OnNotify: TNotifyEvent );
begin
  inherited Create( True );
  FreeOnTerminate := True;
  FOnNotify := OnNotify;
  FInterval := aInterval;
  FCloseEvent := TSimpleEvent.Create;
  FEnableEvent:= TSimpleEvent.Create;
  FEnabled := False;
  FOneSec := False;
  Resume;
end;

destructor TTimerThread.Destroy;
begin
  FCloseEvent.Free;
  Inherited Destroy;
end;

procedure TTimerThread.Execute;
var
  Signaled : Integer;
  h, m, s, ms : Word;
  EventHandles: array[0..1] of THandle;
begin
  EventHandles[0] := FCloseEvent.Handle;
  EventHandles[1] := FEnableEvent.Handle;
  repeat
    Signaled := WaitForMultipleObjects( 2, @EventHandles, False, FInterval );
    case Signaled of

      // Close event, terminate the thread
      WAIT_OBJECT_0 :
        begin
          ResetEvent(FCloseEvent.Handle);
          Break;
        end;

      WAIT_OBJECT_0 + 1:
        begin
          ResetEvent(FEnableEvent.Handle);
          FEnabled := True;
        end;

      // Timer Event
      WAIT_TIMEOUT :
        if Not FOneSec then
          Synchronize(Notify)
        else
        begin
          // Has a second passed ?
          DecodeTime( Now, h, m, s, ms );
          if s <> FLastSec then
          begin
            Synchronize(Notify);
            FLastSec := s;
          end;
        end;

    end;
  until Terminated;
end;

procedure TTimerThread.Notify;
begin
  if Assigned( FOnNotify ) and FEnabled then
    FOnNotify( Self );
end;

procedure TTimerThread.Stop;
begin
  FEnabled := False;
  SetEvent(FCloseEvent.Handle);
end;

procedure TTimerThread.SetEnabled( Value: Boolean );
begin
  if FEnabled <> Value then
    if Value then
      SetEvent(FEnableEvent.Handle)
    else
      FEnabled := False;
end;

procedure TTimerThread.SetInterval( Value: Longint );
begin
  if FEnabled then
  begin
    FEnabled := False;
    FInterval := Value;
    SetEvent(FEnableEvent.Handle);
  end
  else
    FInterval := Value;
end;


end.
mfg Rumpi
Angehängte Dateien
Dateityp: zip cl_thread.zip (1,1 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
markon

Registriert seit: 12. Sep 2003
229 Beiträge
 
#4

Re: Zeitabhängige Ereignisse auslösen

  Alt 31. Okt 2003, 09:53
wow

die thread-programmierung ist ja auf den ersten blick voll "übel".

werde ma kucken..
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#5

Re: Zeitabhängige Ereignisse auslösen

  Alt 31. Okt 2003, 12:20
Wie meinst du das mit voll übel?

Ich hatte zum Anfang auch meine Probleme damit
und bin auf einen Timer gegangen.

Aber dann habe ich mir die Mühe gemacht...

Ich habe mir auch einen TPrecDelay Thread
geschrieben mit dem man Delays (Sleeps)
im µs realisieren kann siehe
-QueryPerformanceFrequency
-QueryPerformanceCounter

diese Funktionen greifen auf den PIT Timer zu.
(mit asm geht das auch unter Delphi 1 !! )

Suche mal im Forum,
da habe ich auch schon mal was gesehen zu QeryPerformance.


mfg Rumpi
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#6

Re: Zeitabhängige Ereignisse auslösen

  Alt 17. Nov 2003, 20:04
Update TTimerThread !

Delphi-Quellcode:
destructor TTimerThread.Destroy;
begin
  FCloseEvent.Free;
  FEnableEvent.Free; // ups hatte ich vergessen
  Inherited Destroy;
end;
mfg Rumpi
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:38 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