AGB  ·  Datenschutz  ·  Impressum  







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

timer in thread?

Ein Thema von iphi · begonnen am 8. Nov 2009 · letzter Beitrag vom 9. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

timer in thread?

  Alt 8. Nov 2009, 20:06
Hallo,

ich habe ein Threadobjekt TCapture, welches Daten von einer Soundkarte aufnimmt.
Das ganze funktioniert über Windows Messages, die der Thread.Execute weiterleitet:

Delphi-Quellcode:
procedure TCapture.Execute;
var msg:Tmsg;
begin
  Fwnd:=allocatehwnd(WndProc); //hier ist jetzt dein Windowhandle für MMAudio
  try
    if StartCapture then
      while getMessage(msg,0,0,0) do //warten auf Message
        DispatchMessage(msg) //verteilen auf das entsprechende Fenster
      else SetFailed(true);
  finally
    logging:=false;
    LogStop;
    LogClose;
    Deallocatehwnd(Fwnd);
  end;
end;
So weit so gut. Jetzt folgende Zusatzaufgabe für den Thread:
Er soll einigermaßen genau t Millisekunden nach dem Aufruf StartCapture einmalig eine Procedure aufrufen.
Wie mache ich das am geschicktesten?
Bisher habe ich das außerhalb des Threads gemacht, ist aber bei CPU Lastschwankungen zu unzuverlässig, daher muss das in den Hochprioritätsthread mit hinein.

Kann ich innerhalb des Threads ein Timerobjekt erzeugen, welches mit derselben Prio läuft wie der Thread? Oder baue ich besser die getMessage-Schleife auf peekMessage um und frage regelmäßig die Tickcounts ab und wenn ja, wie würde das mit peekMessage konkret aussehen?

Danke, Thomas
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: timer in thread?

  Alt 8. Nov 2009, 20:17
Erzeuge einfach einen Timer. Entweder über TTimer oder direkt mit settimer und killtimer an dein Fenster.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: timer in thread?

  Alt 8. Nov 2009, 20:30
Warum nicht einfach Delphi-Referenz durchsuchenSleep?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.150 Beiträge
 
Delphi 12 Athens
 
#4

Re: timer in thread?

  Alt 8. Nov 2009, 20:35
Gut, die/eine NachrichtenSchleife hast du ja schon im Thread, also könnte es was mit dem Timer werden.
Diesen mußt du aber auch in diesem Thread erstellen.

Allerdings ... was sind "einige millisekunden"?

Timer gehen nicht grade genauch (so grob nur in Intervallen mit Vielfachen von rund 16 Millisenkunden)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#5

Re: timer in thread?

  Alt 8. Nov 2009, 20:43
Die Auflösung von 16ms ist ausreichend. Wenn ichs genauer wollte, könnte ich ja einen MMTimer nehmen.
Sleep geht nicht, weil die Prozessierung der Messages im Thread ja weiterlaufen soll.

Noch eine Frage:
wenn ich die Zeile
Fwnd:=allocatehwnd(WndProc); von TCapture.Execute nach TCapture.Create verschiebe, dann meldet FastMM4 beim Stoppen des Threads ein Speicherloch. Warum?

Ich würde den Timer gerne in TCapture.Create erzeugen, aber dazu benötige ich das Fensterhandle Fwnd.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: timer in thread?

  Alt 8. Nov 2009, 20:45
Weil du alles im Thread (gerade Fenster und Message-Sachen) machen musst, und der Thread ist nur in Execute (und leider auch in Destroy), aber nicht im Constructor. Auch den Timer zwingend nur in Execute (oder davon aufgerufene Methoden) erstellen und löschen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#7

Re: timer in thread?

  Alt 8. Nov 2009, 20:47
ok, verstehe.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.150 Beiträge
 
Delphi 12 Athens
 
#8

Re: timer in thread?

  Alt 8. Nov 2009, 20:54
.Execute läuft im erstellten Thread und alles, was von da aus aufgerufen wird auch (abgesehn via Synchronize)

.Create läuft noch im erstellenten Thread, da erst danach der eigene Thread erstellt wird.


Fenster sind threadgebunden und da die Timer an Fenster gebunden sind, sind diese auch an den erstellenden Thread gebunden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#9

Re: timer in thread?

  Alt 9. Nov 2009, 07:44
Wie erstelle ich denn konkret den Timer in meinem Thread?

Delphi-Quellcode:
with TTimer.Create(Self) do
begin
   Interval := 1000;
   Enabled := False;
   OnTimer := MyTimerEventHandler;
end;
geht nicht, weil TCapture (=self) und TObject nicht kompatibel sind. Ich habe ja ein virtuelles Fenster in meinem Thread. Wie komme ich da ran, d.h. was muss ich statt Self benutzen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.150 Beiträge
 
Delphi 12 Athens
 
#10

Re: timer in thread?

  Alt 9. Nov 2009, 07:55
statt self einfach nil nehmen TTimer erstellt sich intern immer eh ein eigenes Fenster, über welches es läuft ... "self" wäre nur der Owner und dieser kümmert sich nur um das automatische Löschen Timers.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:42 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