AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Empfang von Daten in einen Thread auslagern
Thema durchsuchen
Ansicht
Themen-Optionen

Empfang von Daten in einen Thread auslagern

Ein Thema von Selecta · begonnen am 8. Mär 2005 · letzter Beitrag vom 8. Mär 2005
Antwort Antwort
Selecta

Registriert seit: 13. Okt 2004
22 Beiträge
 
Delphi 7 Architect
 
#1

Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 13:21
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] = '1then //Status Error
  begin
    StatusError := true;
    MasterStatus := false;
  end;
  if BinString[9] = '1then //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] = '1then //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] = '1then //Line 2 to high?
  begin
    Label10.Visible := true;
    Shape5.Visible := true;
  end;
  if BinString[5] = '1then //Line 1 to high?
  begin
    Label9.Visible := true;
    Shape4.Visible := true;
  end;
  if BinString[4] = '1then //Line 2 to low?
  begin
    Label8.Visible := true;
    Shape3.Visible := true;
  end;
  if BinString[3] = '1then //Line 1 to low?
  begin
    Label7.Visible := true;
    Shape2.Visible := true;
  end;
  if BinString[2] = '1then //Error Infrared CRC?
  begin
    Label6.Visible := true;
    Shape1.Visible := true;
  end;
  if BinString[1] = '1then //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]
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 13:25
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Selecta

Registriert seit: 13. Okt 2004
22 Beiträge
 
Delphi 7 Architect
 
#3

Re: Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 13:28
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 13:40
Zitat von Selecta:
Nur für den Rest hätte ich mir mehr Beispiele gewünscht
Was für ein Rest?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Selecta

Registriert seit: 13. Okt 2004
22 Beiträge
 
Delphi 7 Architect
 
#5

Re: Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 13:50
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. ^^
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 13:54
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Selecta

Registriert seit: 13. Okt 2004
22 Beiträge
 
Delphi 7 Architect
 
#7

Re: Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 14:01
ähm...nicht genau.

aber lass uns das per pn klären.
du hast nicht per zufall nen ansatz zu meinem problem?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Empfang von Daten in einen Thread auslagern

  Alt 8. Mär 2005, 14:04
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 06:51 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