AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

SetTimer in einer Klasse

Ein Thema von magicshadow · begonnen am 4. Mär 2004 · letzter Beitrag vom 13. Apr 2004
Antwort Antwort
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#1

SetTimer in einer Klasse

  Alt 4. Mär 2004, 13:43
Hallöchen.

Ich möchte ein Programm von mir um einige Kb erleichtern und das indem ich die Forms Unit entferne, daher kann ich auch den Delphi timer nicht nutzen (da dieser die Unix Forms referenziert)

Also bin ich auf SetTimer umgestiegen. (Die API Funktion)

Mien Problem ist nun, das ich eine klasse habe, von der ich mehrere Instanzen erzeuge udn jede braucht einen eigenen Timer.

Normale Proceduren kann ich auch als CallBack Proceduren angeben, nur wenn ich eine Prozedur einer Klasse angeben möchte gibt es immer den Fehler "Variable Erforderlich) gibt es eine Möglichkeit dieses zu umgehen, oder zumindest in einer Timer Procedure zu erkennen welche instanz des Timers das Event ausgelöst hat um dann auß einer Liste die entsprechende Klasseninstanz zu holen?

Danke schonmal
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#2

Re: SetTimer in einer Klasse

  Alt 12. Apr 2004, 11:20
Also ich hab das problem gelöst, über eine HilfsVariable gehts dann.

Allerdings hab ich jetzt ein andrees Problem.

Ich bin am Programieren einer dll, darin nutze ich Klassen und eine davon soll mit hilfe von SetTimer eine ihrer proceduren aufrufen, klappt soweit auch recht gut, nur wenn ich dann auf eine Variable dieser Klasse zugreifen möchte gibt es einen Fehler (und die Procedure wird ohne Ausgabe beendet)

Kennt einer dasProblem und weiß wie man es (möglichst ohne ein Fenster mit WindowProcedure zu erstellen) lösen kann?

Wäre super.

Ach ja, ich rufe SetTimer so auf:

Delphi-Quellcode:
type
oTimerProc = procedure of object;
var
hTimer : longint;
procedure TWas.TimerProc;
begin
...
end;

procedure TWas.InitTimer;
var
TimerVar: oTimerProc;
begin
TimerVar := self.TimerProc;
hTimer := SetTimer(0, 0, 1000, @TimerVar);
end;
wenn ich den code in einer exe ausführe geht es, nur in einer dll macht es probleme.

PS: Ich nutze in der Dll einen eigenen Threat.

[edit=r_kerber]Code- durch Delphi-Tags ersetzt. Mfg, r_kerber[/edit]
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#3

Re: SetTimer in einer Klasse

  Alt 13. Apr 2004, 19:58
Seltsam das Du es überhaupt so zum laufen bekommst, ich würde da mit Zugriffsverletzungen rechnen

Aus der Win32-Hilfe:
Zitat:
The TimerProc function is an application-defined callback function that processes WM_TIMER messages.

VOID CALLBACK TimerProc(

HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
);
Wie Du vielleicht erkennst hat das nicht viel mit Deiner Methoden TWas.TimerProc zu tun.

Hier mal noch eine andere Lösungsmöglichkeit, die zudem den Vorteil bietet das man innerhalb der (globalen) Callback-Prozedur über "dwUser" auch die Möglichkeit hat auf eine Objektinstanz zuzugreifen:
Delphi-Quellcode:
program Project1;

uses
  Windows,
  Classes,
  Types,
  mmSystem,
  SysUtils;

type
   TLittleTimer = class(TObject)
   private
     FCount: Cardinal;
     FTimerID: Cardinal;
   public
     constructor Create;
     destructor Destroy; override;
     function IsActive: Boolean;
     procedure Pieps;
     property TimeCallCount: Cardinal read FCount;
     procedure Start(Delay: Cardinal);
     procedure Stop;
  end;

var
  Was: TLittleTimer;

{ CallBack-Prozedur
  Obwohl diese Prozedur global deklariert ist erlaube ich mir auf
  die als private deklarierten Felder von TLittleTimer zuzugreifen,
  schliesslich ist diese Routine fester Bestandteil von TLittleTimer.
  In gleicher Weise liesse sich hier auch ein Event auslösen.
}

procedure MyTimeCallBack(uID, uMsg: Cardinal; dwUser, dw1, dw2: DWord); stdcall;
var
  Tmr: TLittleTimer;
begin
  Tmr := TLittleTimer(dwUser);
  Inc(Tmr.FCount);
  Tmr.Pieps;
end;

{ TLittleTimer }

constructor TLittleTimer.Create;
begin
  inherited;
  FCount := 0;
  FTimerID := 0;
end;

destructor TLittleTimer.Destroy;
begin
  Stop;
  inherited;
end;

function TLittleTimer.IsActive: Boolean;
begin
  Result := FTimerID <> 0;
end;

procedure TLittleTimer.Pieps;
begin
  Beep;
end;

procedure TLittleTimer.Start(Delay: Cardinal);
begin
  if FTimerID = 0 then
  begin
    FCount := 0;
    // Timer starten und eigene Instanz in dwUser übergeben
    FTimerID := TimeSetEvent(Delay, 0, @MyTimeCallBack, Cardinal(Self),
      TIME_PERIODIC);
  end;
end;

procedure TLittleTimer.Stop;
begin
  if FTimerID <> 0 then
    TimeKillEvent(FTimerID);
end;
{------------------------------------------------------------------------------}

begin
  Was := TLittleTimer.Create;
  try
    Was.Start(500);
    if Was.IsActive then
    begin
      while Was.TimeCallCount < 5 do
      begin
        Sleep(1);
        DoSomething;
      end;
    end;
  finally
    Was.Free;
  end;
end.
"TimeSetEvent", "TimeKillEvent" und "TimeProc" sind die passenden Schlagworte in der Win32-Hilfe.

MfG,
Tryer
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: SetTimer in einer Klasse

  Alt 13. Apr 2004, 20:05
Für SetTimer braucht man auf alle fälle ein Fenster-Handle. TimerProc leitet ja bloß die Nachricht um. Du solltest etwas an deinem Konzept feilen.

Vorschlag:
Delphi-Quellcode:
ITimeEvent = interface
  procedure Tick;
end;
SetTimer(WinHandle, Integer(Was), 1000, nil); in WM_TIMER-Handler

(TObject(wParam) as ITimeEvent).Tick; Es kann auch einfacher gelöst werden.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  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 00:36 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