Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Empfang von Daten in einen Thread auslagern (https://www.delphipraxis.net/41772-empfang-von-daten-einen-thread-auslagern.html)

Selecta 8. Mär 2005 13:21


Empfang von Daten in einen Thread auslagern
 
Hallo miteinander

Ich kommuniziere mit Hilfe der SerialNG Komponente (www.domis.de) über einen Virtuellen Comport mit einem FPGA.

Auf meinem Form kann ich Daten senden und empfangene Daten darstellen (Graph, Image usw.). Das empfangen ist zyklisch, jede Sekunde 1mal. Da das lesen aber eine Zeit dauert, kann ich währendessen nichts senden. Schön wäre es, wenn ich das zyklische Empfangen nun in einen eigenen Thread unterbgringen würde.
Statusregister, Error handling und die Temperatur werden ausgelesen.

Jedenfalls dachte ich das ;)
Probleme: Der Thread muss auf das Form zugreifen können, auf den Gprah zeichnen usw. und auf 2 Globale Variablen.

Da ich nur jede Sekunde 1mal empfangen will, dachte ich könnte mithilfe eines Timers einfach jede Sekunde den Thread starten?
So wie ich das sehe erzeuge ich aber jedesmal einen neuen Thread? :-/

Delphi-Quellcode:
function TForm1.seqread(p:pointer): integer;
var
  Sendbuffer : String;
  rData : String;
  rText : String;
  rDataword : word;
  zeit : String;
  i : integer;
  x : Char;
  BinString : String;
  ADDString : String;
  dc: HDC;
begin
  dc := GetDC(Form1.Handle);
  if MasterStatus = true then
  begin

  Timer1.Enabled := false;

  Sendbuffer := ('01100100010100000000') + #13#10;  //Status
  SerialPortNG1.SendString(sendBuffer); // Send String
  while SerialPortNG1.SendInProgress do
   begin
     Application.ProcessMessages;
   end;
  Repeat
  pause(10);
  rData := SerialPortNG1.ReadNextClusterAsString(); //empfangene Daten lesen
  if (rData = '') and (Timer2.Enabled = false) then
    Timer2.Enabled := true;
  until rData <> '';
  Timer2.Enabled := false;

  rText := Copy(rdata, 13, 4); // Status Value
  rDataword := StrToInt('$'+rText);
  BinString := '';
  for i := 1 to 4 do   //Hex to Bin
  begin
    x := rtext[i];
    case x of
      '0': ADDString := '0000';
      '1': ADDString := '0001';
      '2': ADDString := '0010';
      '3': ADDString := '0011';
      '4': ADDString := '0100';
      '5': ADDString := '0101';
      '6': ADDString := '0110';
      '7': ADDString := '0111';
      '8': ADDString := '1000';
      '9': ADDString := '1001';
      'A': ADDString := '1010';
      'B': ADDString := '1011';
      'C': ADDString := '1100';
      'D': ADDString := '1101';
      'E': ADDString := '1110';
      'F': ADDString := '1111';
    end;
    BinString := BinString + AddString;
  end; // for
  //Bit reading Status
  if BinString[16] = '1' then //Status Error
  begin
    StatusError := true;
    MasterStatus := false;
  end;
  if BinString[9] = '1' then //Three or One phase?
  begin
    OnePhaseImage.visible := false;
    ThreePhaseImage.visible := true;
    PhaseLabel.Caption := 'Three phase';
  end
  else
  begin
    ThreePhaseImage.visible := false;
    OnePhaseImage.visible := true;
    PhaseLabel.caption := 'One phase';
  end;
  if BinString[10] = '1' then //Line 1 First?
  begin
    L2Image.Visible := false;
    L1Image.Visible := true;
  end
  else
  begin
    L1Image.Visible := false;
    L2Image.Visible := true;
  end;
  // End of Status

  //Begin of Error
if StatusError = true then
  begin
    Sendbuffer := ('01100100010200000000') + #13#10;  //Status
  SerialPortNG1.SendString(sendBuffer); // Send String
  while SerialPortNG1.SendInProgress do
   begin
     Application.ProcessMessages;
   end;
  Repeat
  pause(10);
  rData := SerialPortNG1.ReadNextClusterAsString();
  if (rData = '') and (Timer2.Enabled = false) then
    Timer2.Enabled := true;
  until rData <> '';
  Timer2.Enabled := false;

  rText := Copy(rdata, 13, 4); // Error Value
  rDataword := StrToInt('$'+rText);
  BinString := '';
  for i := 1 to 4 do
  begin
    x := rtext[i]; //Hex to BIn
    case x of
      '0': ADDString := '0000';
      '1': ADDString := '0001';
      '2': ADDString := '0010';
      '3': ADDString := '0011';
      '4': ADDString := '0100';
      '5': ADDString := '0101';
      '6': ADDString := '0110';
      '7': ADDString := '0111';
      '8': ADDString := '1000';
      '9': ADDString := '1001';
      'A': ADDString := '1010';
      'B': ADDString := '1011';
      'C': ADDString := '1100';
      'D': ADDString := '1101';
      'E': ADDString := '1110';
      'F': ADDString := '1111';
    end;
    BinString := BinString + AddString;
  end; // for
  if BinString[6] = '1' then //Line 2 to high?
  begin
    Label10.Visible := true;
    Shape5.Visible := true;
  end;
  if BinString[5] = '1' then //Line 1 to high?
  begin
    Label9.Visible := true;
    Shape4.Visible := true;
  end;
  if BinString[4] = '1' then //Line 2 to low?
  begin
    Label8.Visible := true;
    Shape3.Visible := true;
  end;
  if BinString[3] = '1' then //Line 1 to low?
  begin
    Label7.Visible := true;
    Shape2.Visible := true;
  end;
  if BinString[2] = '1' then //Error Infrared CRC?
  begin
    Label6.Visible := true;
    Shape1.Visible := true;
  end;
  if BinString[1] = '1' then //Error Infrared Watchdog
  begin
    Label5.Visible := true;
    Shape6.Visible := true;
  end;

end; //if Status Error

//begining of Temp Measure
  Sendbuffer := ('01100100001800000000') + #13#10;  //Status
  SerialPortNG1.SendString(sendBuffer); // Send String
  while SerialPortNG1.SendInProgress do
   begin
     Application.ProcessMessages;
   end;
  Repeat
  pause(10);
  rData := SerialPortNG1.ReadNextClusterAsString();
  if (rData = '') and (Timer2.Enabled = false) then
    Timer2.Enabled := true;
  until rData <> '';
  Timer2.Enabled := false;

  rText := Copy(rdata, 13, 4); // Status Value
  rDataword := StrToInt('$'+rText);
  zeit := DateTimeToStr(now);
  Series1.Add(rdataword, zeit, clTeeColor);
end; // if Master Status
  Timer1.Enabled := true;
  ReleaseDC(Form1.Handle, dc);
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var
  id : cardinal;
begin
  BeginThread(nil, 0, addr(TForm1.seqread), nil, 0, id); //Thread erzeugen
end;
Was genau geschieht müsst ihr ja nicht verstehen :), es geht vorallem um das Timer1 ereigniss (ganz unten).

Anderer Lösungsansatz: Man könnte doch den Thread beim erstellen des Forms erzeugen und dann immer wieder schlafen legen. Aber da hab ich überhaupt keine ahnung wie das funktionieren soll.

Ich hoffe ich habe es verständlich geschildert :)

btw: http://www.luckie-online.de/Tutorial...mit_Delphi.pdf
ist das der gleiche Luckie wie im forum hier?

grz

Selecta

[edit=Luckie]Code-Tags durch Delphi-Tags ersetzt. Mfg, Luckie[/edit]

Luckie 8. Mär 2005 13:25

Re: Empfang von Daten in einen Thread auslagern
 
Zitat:

Zitat von Selecta
btw: http://www.luckie-online.de/Tutorial...mit_Delphi.pdf
ist das der gleiche Luckie wie im forum hier?

Ich hoffe es. ;)

Selecta 8. Mär 2005 13:28

Re: Empfang von Daten in einen Thread auslagern
 
Die Einführung und die Grundlagen sind wirklich genial.

Nur für den Rest hätte ich mir mehr Beispiele gewünscht, für so einen Programmier b00n wie mich ;)

Luckie 8. Mär 2005 13:40

Re: Empfang von Daten in einen Thread auslagern
 
Zitat:

Zitat von Selecta
Nur für den Rest hätte ich mir mehr Beispiele gewünscht

Was für ein Rest?

Selecta 8. Mär 2005 13:50

Re: Empfang von Daten in einen Thread auslagern
 
ahh sry
ich meinte mit grundlagen 3.1, ist wirklich gut erklärt.

Bei 3.2 und 3.3 wäre ein Beispielprogramm wie man das im source einbindet sehr schön. Thread funktion. Für jemand der viel Delphi programmiert und OOP schreibt ist das sicher verständlich. für jemand der eher von der low-level seite kommt eher nicht ;). aber ja das liegt mehr an mir und nicht am verfasser. ^^

Luckie 8. Mär 2005 13:54

Re: Empfang von Daten in einen Thread auslagern
 
Zitat:

Zitat von Selecta
Bei 3.2 und 3.3 wäre ein Beispielprogramm wie man das im source einbindet sehr schön.

Das mache ich doch in jedem Demo-Programm vor, wie das geht. :gruebel:

Selecta 8. Mär 2005 14:01

Re: Empfang von Daten in einen Thread auslagern
 
ähm...nicht genau.

aber lass uns das per pn klären.
du hast nicht per zufall nen ansatz zu meinem problem?

Luckie 8. Mär 2005 14:04

Re: Empfang von Daten in einen Thread auslagern
 
In der Zip-Version sind übrigens Demo-Anwendungen dabei, falls du das nicht gesehen hast. Und wie viel beispielcode brauchst du denn noch? Mehr als eine einfache Demo-anwendung kann ich auch nicht machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz