AGB  ·  Datenschutz  ·  Impressum  







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

Timer in Thread führt OnTime nicht aus...

Ein Thema von 7down · begonnen am 5. Apr 2007 · letzter Beitrag vom 26. Jun 2007
Antwort Antwort
7down

Registriert seit: 27. Jan 2007
13 Beiträge
 
#1

Timer in Thread führt OnTime nicht aus...

  Alt 5. Apr 2007, 14:05
Hallo,

ich hab in meinem Programm mehrere Threads und möchte eine Art Timeout für die Threads coden, dh sobald der Thread länger als x Minuten existiert, soll er neugestartet werden.

Mein Problem ist aber, dass der Timer eifnach nichts macht, hab auch schon nen Breakpoint im OnTimeout gesetzt, nützt nichts, der führt das einfach nicht aus. Der Timer wird im Konstruktor des Threads erstellt. Interval hab ich auch testweise schon auf 1 gehabt etc etc...

Hier mal mein Code:
Delphi-Quellcode:
  Timeout := TTimer.Create(nil);
  Timeout.Interval := 1000;
  Timeout.OnTimer := OnTimeout;
  Timeout.Enabled := True;

[...]

procedure TMyThread.OnTimeout(Sender: TObject);
begin
fmain.mdebug.Lines.Add('timeout');
  //Restart;
end;
Versteht das irgendwer??
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Timer in Thread führt OnTime nicht aus...

  Alt 5. Apr 2007, 14:32
ähm... sicher dass du das in MyThread definiert haben willst?

ich würd das außerhalb des Threads definieren und den Thread von außerhalb abschießen und neustarten.

EDIT: Merke: VCL ist nicht threadsicher!
Lukas Erlacher
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Timer in Thread führt OnTime nicht aus...

  Alt 5. Apr 2007, 14:53
Ich denke das Problem ist das TTimer auf Windows-Messages basiert und diese AFAIK nicht so im Thrad "durchschlagen".
Es gibt aber AFAIK 'ne WinAPI-Funktion um per Callback einen Timer zu haben.


Zitat von DGL-luke:
EDIT: Merke: VCL ist nicht threadsicher!
Wobei das Grundproblem bei der Win32-API liegt. Siehe Beitrag von A. Kosch
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
7down

Registriert seit: 27. Jan 2007
13 Beiträge
 
#4

Re: Timer in Thread führt OnTime nicht aus...

  Alt 5. Apr 2007, 16:59
Hm, danke schon mal..

Wie könnte ich sonst ein Timeout realisieren? Ich hab acuh schon versucht im TMyThread nochmal einen Thread (TTimeoutThread) zu integrieren, welcher einfach x Minuten "sleept" und dann den Thread restarted. Hat aber irgendwie nicht so wirklich geklappt..

Wär nice wenn mir da jmd helfen könnte.

Danke und ciao
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Timer in Thread führt OnTime nicht aus...

  Alt 26. Jun 2007, 09:17
Hallo,
hatte ungefähr 10 Minuten das gleiche Problem. Auf der Suche nach einer Lösung bei ich folgendeSeite gefunden.
Da TTimer AllocateHWND verwendet habe ich nicht weiter gesucht und mich für eine Threadlösung entschieden.
Delphi-Quellcode:
unit hyps_ServerTimerThread_impl;

interface

uses
  Windows, Messages, Classes;

const

  PM_TIMERTHREAD_EVENT = WM_APP+10002;

type

  TTimerThread = class(TThread)
  private
    { Private-Deklarationen }
    FSinkThreadID : THandle;
    FInterval : DWord;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
    property Interval : DWord read FInterval write FInterval;
    property SinkThreadID : THandle read FSinkThreadID write FSinkThreadID;
  end;

implementation


{ TimerThread }

constructor TTimerThread.Create(CreateSuspended: Boolean);
begin
  FInterval:=5000;
  inherited Create(CreateSuspended);
  FreeOnTerminate:=True;
end;

procedure TTimerThread.Execute;
begin
  While Not Terminated do
    begin
    Sleep(FInterval);
    If (FSinkThreadID<>0) then
      PostThreadMessage(FSinkThreadID,PM_TIMERTHREAD_EVENT,0,0);
    end;
end;

end.
Die Genuigkeit bei der Einhaltung des Intervals ist für mich völlig uninteressant.
Hauptsache es wird mehr oder weniger periodisch aufgerufen.

Delphi-Quellcode:
  THypsClientThread = Class(TServerClientThread)
  private
    ...
    FUploadTimer : TTimerThread;

constructor THypsClientThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
begin
  FClientStream:=TMemoryStreamExt.Create;
  FUploadTimer:=TTimerThread.Create(True);
  inherited Create(CreateSuspended, ASocket);
  FUploadTimer.SinkThreadID:=ThreadID;
end;

procedure THypsClientThread.ClientExecute;
var
  Msg : tagMsg;
begin
  ...
        If PeekMessage(Msg, 0, PM_TIMERTHREAD_EVENT, PM_TIMERTHREAD_EVENT, PM_REMOVE) then
          begin
          If Msg.message=PM_TIMERTHREAD_EVENT then
            UploadTimerEvent;
          end;
  ...
end;
Funktionsweise:
THypsClientThread erzeugt im Create den TTimerThread. an TTimerThread wird die ThreadID von THypsClientThread übergeben.
Der TTimerThread wird über Resume und Suspend aktiviert. Wenn der TTimerThread aktiviert ist wird über PostThreadMessage
über die THypsClientThread.ThreadID eine Botschaft an THypsClientThread gesendet. In THypsClientThread wird beim Empfang
der Botschaft die Methode UploadTimerEvent aufgerufen. Funktioniert prima.

Jetzt Frage: Ist die Sache threadsafe?
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Timer in Thread führt OnTime nicht aus...

  Alt 26. Jun 2007, 09:28
Einen Timer in einen Thread halte ich für nicht sehr glücklich. Warum startest du nicht den Thread und merkst dir, wann du ihn gestartet hast und wenn die Zeit um (-> Timer) ist beendest du ihn.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Timer in Thread führt OnTime nicht aus...

  Alt 26. Jun 2007, 09:33
Hallo Luckie,
hast Du mir geantwortet? Wenn ja- ich habe keinen TTimer verwendet. Weil AllocateHWND nicht threadsafe ist.
Aus einem Thread heraus muss ich in besitmmtem Abständen prüfen ob eine Datei vorhanden ist.
Dafür wollte ich ursprünglich einen TTimer verwenden. Davon bin aber ab und verwende stattdessen einen weitren Thread.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Timer in Thread führt OnTime nicht aus...

  Alt 26. Jun 2007, 09:51
Die Loesung mit Sleep ist schon ganz gut, aber der Nachteil ist das der Thread nicht vorzeitig durch Terminate beendet werden kann.
Ein Event muesste her auf den man mit WaitForSingleObject und Timeout wartet. Leider ist TThread nicht dafuer geeignet. Terminate ist nicht virtuell.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Timer in Thread führt OnTime nicht aus...

  Alt 26. Jun 2007, 10:04
das Problem beim Timer im Thread ist nicht das es nicht Threadsafe ist sondern das ihr keine Nachrichtenschleife habt. Und ohne Nachrichtenschleife werden auch keine Nachrichten ausgewertet. Somit auch keine Timer-messages.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Timer in Thread führt OnTime nicht aus...

  Alt 26. Jun 2007, 11:03
Per WinAPI kanns man aber ein Hier im Forum suchenMessage-only-window erzeugen, wo man dann ein handle und eine nachrichtenschleife hat.

Natürlich ist TTimer im Thread dann immer noch nicht elegant...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  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 00:56 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