Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Verwendung der Komponente: Timer (https://www.delphipraxis.net/142280-verwendung-der-komponente-timer.html)

rulix 25. Okt 2009 09:40


Verwendung der Komponente: Timer
 
Ich verstehe nicht, warum das lesen und darstellen von Daten in einer procedure Timer1Timer stattfindet, entsprechend der Source, die ich eben fand.
Warum muss man die Timerzeit (100ms)ablaufen lassen, ehe man ein Byte lesen darf.
Leider steht im Refernzhandbuch nur drin, was der Timer macht, nicht wann man ihn einsetzt, außer dem OnTimer Ereignis. Aber da steht ja nix davon in dieser Source.
Bin eben noch Anfänger, total privat.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
  var Dat: Integer;
begin
  while INBUFFER > 0 do begin
    Dat := ReadByte;
    MemoBinIn.Lines[LineBin] := MemoBinIn.Lines[LineBin] + IntToStr(Dat)+ ' ';
    if length (MemoBinIn.Lines[LineBin]) > 40 then begin
      MemoBinIn.Lines.add ('');
      LineBin := MemoBinIn.Lines.count;
    end;
    if Dat <> 10 then MemoTextIn.Lines[LineText] := MemoTextIn.Lines[LineText] + Chr(Dat);
    if Dat = 13 then begin
      MemoTextIn.Lines.add ('');
      LineText := LineText +1
    end;
    if length (MemoTextIn.Lines[LineText]) > 25 then begin
      MemoTextIn.Lines.add ('');
      LineText := LineText +1
    end;
    if INBUFFER > 500 then ClearBuffer;
  end;
Ist das der übliche Weg?
Wer hilft mir bitte auf die Sprünge?

[edit=SirThornberry]code-tags durch delphi-tags ersetzt - Mfg, SirThornberry[/edit]

thkerkmann 25. Okt 2009 10:24

Re: Verwendung der Komponente: Timer
 
Hi,

ich weiss ja nicht, wozu dieser Code dient - aber effizient ist er in der Tat nicht.
Um was für ein Programm handelt es sich denn da ?

Gruss

haentschman 25. Okt 2009 10:28

Re: Verwendung der Komponente: Timer
 
Guten Morgen,

du hast das schon richtig erkannt. Timer1Timer wird entsprechend der Einstellung (in diesem Fall 100ms) ausgeführt. D.h. unabhängig welcher Code in der Procedure steht wird sie alle 100 ms aufgerufen. Der Code in der Prozedur liest ein Byte, und verarbeitet es im Memo (ganz grob :zwinker: )
Warum das lesen in dem Timer ausgeführt wird kann ich dir auch nicht sagen. Vieleicht hatte es hardwaretechnischen Gründe. Wenn ich deine Frage richtig interpretiert habe ob das immer so mit dem Timer sein muß, ein klares NEIN :zwinker:

:hi:

himitsu 25. Okt 2009 11:00

Re: Verwendung der Komponente: Timer
 
Das Problem ist hier, daß du einen Code von einem Programm hast und nicht weißt was dort warum passiert.
Wir haben hier immer nur Bruchstücke davon und wissen dagegen dann nicht was in den restlichen Programmteilen los ist, also können wir praktisch garnicht viel helfen und höchtens mal etwas raten.

INBUFFER: also irgendwo anders wird da ein Puffer gefüllt
und abhängig davon würde ich womöglich an dieser Stelle mal ansetzen ... denn ich würde da die Auswertung gleich mit starten.
Und wenn das wegen 'ner Zeitkritschien Angelegenheit nicht geht, dann würde ich die Prozedur im Timer etwas optimieren ... eventuell einfach dadurch, daß gleich mehrere/alle Bytes ausgewertet werden.

thkerkmann 25. Okt 2009 12:37

Re: Verwendung der Komponente: Timer
 
Naja, die Auswertung beschränkt sich auf Zeilenumbrüche....

ob das nicht nur ein Log oder sowas ist ?

rulix 25. Okt 2009 14:52

Re: Verwendung der Komponente: Timer
 
Zitat:

Zitat von thkerkmann
Hi,

ich weiss ja nicht, wozu dieser Code dient - aber effizient ist er in der Tat nicht.
Um was für ein Programm handelt es sich denn da ?

Gruss

Die Routine holt ein Byte ab und stellt sie in einem Memofeld dar.
Die Byte routine ist in einerm Modul rscom.pas definiert. Da stehen Sachen, die nach API von MS klingen.
Es geht um eine Kommunikation mit einem AVR ATtiny2313.
Der sendet bytes die in einem Memofenster dargestellt werden.

Eigentlich würde ich gerne bytes vom uC in einer Warteschleife empfangen, aber aus der muss ich ja irgendwie auch rauskommen können; also hat der Schreiber dieser Routine so was wie einen Softwareinterrupt gemacht, denk ich, nachdem ich jetzt weiss, dass mit 1o Hz abgefragt wird.
Im Prinzip ist es so ähnlich wie ein Hyperterminal. Ich nehme an, dass ein byte irgendwann eintrifft und erst mit Readbyte() abgeholt wird. Was passiert eigentlich, wenn es nicht abgeholt wurde und ein 2. byte eintrifft?
Steckt dann alles, oder wird das 1. byte verworfen. Das sind Innereien von denen ich keine Ahnung habe.
Was der uC dann machen würde, weiss ich genau, aber Delphi und API ist mir unklar. Muss ich das überhaupt wissen?

Zur Verdeutlichung noch einige Zeilen aus der rscom.pas.

Code:
function INBUFFER (): DWORD;
var Comstat: _Comstat;
    Errors: DWORD;
begin
  if ClearCommError (PortHandle, Errors, @Comstat) then
  INBUFFER := Comstat.cbInQue else INBUFFER := 0;
end;

function READBYTE(): Integer;
var Dat: Byte;
    BytesRead: DWORD;
begin
 ReadFile(PortHandle,Dat,1,BytesRead,NIL);
 if BytesRead = 1 then Result:=Dat else Result := -1;
end;
Hat jemand einen Vorschlag für mich, wie ich das anders machen könnte?
Vielleicht ein Vorschlag, wenn ich nicht zu aufdringlich bin, von dir, haentschman?
Ich danke jedenfalls für die rege Beteiligung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:18 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