AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Hilfe! Timer innerhalb eines Thread laufen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe! Timer innerhalb eines Thread laufen lassen

Ein Thema von divBy0 · begonnen am 15. Mai 2007 · letzter Beitrag vom 15. Mai 2007
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#11

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 13:12
Ok, danke!

Ich glaube ich habs begriffen... Wenn ich noch was wissen muss, kann ich euch dann auch im Zweifelsfall per PN anschreiben?
Marc
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 13:18
nein! Denn per PN hast nur die etwas davon und andere mit dem gleichen Problem bleiben im Regen stehen. Bei Fragen die im Forum gestellt werden haben alle etwas davon und genau davon lebt ein Forum auch, vom gegenseitigen Helfen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#13

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 13:28
Ups, so war das auch nicht gemeint...

Den entgültigen Lösungsweg hätte ich dann schon gepostet.
Marc
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 13:32
Hallo,

wenn der Thread zum Auslesen da sein soll, würde ich folgendes Prinzip verfolgen (als Denkanstoß)
  • Thread liest Daten aus der Schnittstelle in einen "eigenen" Puffer und informiert die Anwendung per Message (selbstdefinieren als Information darüber, dass in dem Puffer neue Daten da sind und an welcher Stelle sie stehen (Puffergröße ausrechnen z.B. auf mind. eine Sekunde Zwischenspeicher)
  • Thread-Klasse selber hat z.B. eine Funktion Abbruch oder Stopp. Intern wird hierbei TEvent verwendet -> Grund siehe unten
  • In der Execute-Methode machst du ein WaitForMultipleObject und "wartest" dort sowohl auf die Schnittstelle (Kann man direkt darauf warten) bzw. auf das TEvent-Object) und entscheidest dann entsprechend Dein verhalten (lesen oder eben abbrechen).
Vorteile:
  • Entkopplung des Lese/ Wartezyklus von der Applikation -> die Applikation kann sich also um "ihre" arbeit kümmern
  • Daten werden (nochmals) gepuffert für die Anwendung und der Thread wird nicht von der "Verarbeitung" der Daten durch die Applikation aufgehalten (Datenverlust)
  • Nicht so Performancelastig, da der Thread wegen WaitForObject nicht so viel Zeit des Prozessors verbraucht wie eine Endlosschleife in einer Applikation
Nachteil:
  • Höhere Aufwand der Programmierung
  • Einarbeiten in das Thema Threads und deren Eigenarten (FreeOnTerminate/Syncronized ...)
  • Erzwungene Trennung und dadurch entstehender Overhead

Viel erfolg dabei

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#15

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 14:08
So, es hat funktioniert...

Hier ist mal der Code:

Delphi-Quellcode:
TMyThread = class(TThread)
  protected
    procedure Execute; override;
    procedure Display;
end;

var
 MyThread : TMyThread;

procedure TMyThread.Display;
begin
  // hier Ausgaben eintragen, Memos, Edits, usw.
end;

procedure TMyThread.Execute;
begin
  while not terminated do
    begin
      // hier Anweisungen (bei mir halt Daten von Steuerung lesen)
      Synchronize(Display);
      sleep(xx); // hier schläft der Thread, bevor er weiterläuft
    end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  MyThread := TMyThread.Create(false);
  MyThread.FreeOnTerminate := true;
end;
Nochmals danke euch allen!!!

@ChrisE:

Auf die Schnittstelle warten funktioniert bei der Anwendung nicht so richtig, daher habe ich den Weg gewählt, dass die Daten entsprechend dem Intervall angefodert und ausgelesen werden. Um den Puffer werde ich mich jetzt kümmern...

Ist auch das erste Mal, dass ich einen Thread benutze, muss mich da jetzt sowieso noch tiefer einarbeiten.
Marc
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 14:10
Warum ist ThreadGo kein Attribut der Thread-Klasse?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#17

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 14:12
Stimmt eigentlich... werd ich gleich ändern...
Marc
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#18

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 14:16
Statt des ThreadGo nimmt man Terminated. Das ist eine Property des Thread-Objektes.
"while not Terminated do"
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#19

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 14:18
Jetzt hab ich mich so gefreut das es läuft...

also, dann mit WHILE NOT TERMINATED DO

Danke
Marc
  Mit Zitat antworten Zitat
WS1976
(Gast)

n/a Beiträge
 
#20

Re: Hilfe! Timer innerhalb eines Thread laufen lassen

  Alt 15. Mai 2007, 14:23
Hallo,
ich glaube du schiesst mit Kanonen auf Spatzen.

Der Weg über polling und genau das machst du mit einem zyklisch gestarteten thread ist doch völlig überflüssig.
Wir machen sowas Eventgesteuert über die Routine Ontriggeravailable der Portkomponente.(serielle Schnittstelle Asynch pro)
Das heisst die Routine wird jedesmal (oder auch erst nach bestimmten Vorraussetzungen) durchlaufen, wenn ein Zeichen über die serielle Schnittstelle eintrifft.
Geschickt programmiert ist das viel effektiver als der Weg über threads.

Grüsse
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 01:34 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