AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit ReadFile;

Ein Thema von EDatabaseError · begonnen am 19. Mär 2007 · letzter Beitrag vom 19. Mär 2007
Antwort Antwort
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#1

Problem mit ReadFile;

  Alt 19. Mär 2007, 00:12
Delphi-Quellcode:
function ReadText: string;
var
  nRead: dword;
  Buffer: string;
begin
  Result := 'a';

  SetLength(Buffer,1);
  if ReadFile( ComFile, PChar(Buffer)^, 1, nRead, nil ) then
    Result := buffer;
end;
Ich nutze diesen Code um die serielle schnittstelle auszulesen. Aufgerufen wird die Prozedur über einen Timer. Nur das Ganze dauert ewigkeiten -> folge Programm bleibt beinahe stehen.

Wie kann ich obrigen Code optimieren das das Prog. wieder flüssig läuft?

Mfg
Tobi
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem mit ReadFile;

  Alt 19. Mär 2007, 00:38
Also die Kurzfassung zu deinem Code wäre wohl dieser:
Delphi-Quellcode:
function ReadText: char;
var
  nRead: dword;
begin
  if not ReadFile(ComFile, @result, 1, nRead, nil) then
    Result := 'a';
end;
An der Funktion selber liegt es also nicht.

welche Daten empfängst du?
welche Übertragungsrate?
wieoft kommt überhaupt mal was an?
wieviele Zeichen empfängst du? (wie oft wird ReadText aufgerufen)
...


hier wird ja nur ein einziges Byte gelesen, das sollte weniger als ein paar Millisekunden dauern.


Die Funktion wartet allerdings bis ein Zeichen am Port angekommen ist...
solange nichts kommt, wird natürlich gewartet.


Es wäre demnach wohl besser dieses in einen Thread auszulagern,
oder es asynchron laufen zu lassen (schau dir dazu mal an wofür der letzte Parameter dieser Funktion ist).
$2B or not $2B
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Problem mit ReadFile;

  Alt 19. Mär 2007, 00:51
Zitat von himitsu:
Also die Kurzfassung zu deinem Code wäre wohl dieser:
Delphi-Quellcode:
function ReadText: char;
var
  nRead: dword;
begin
  if not ReadFile(ComFile, @result, 1, nRead, nil) then
    Result := 'a';
end;
An der Funktion selber liegt es also nicht.

welche Daten empfängst du?
welche Übertragungsrate?
wieoft kommt überhaupt mal was an?
wieviele Zeichen empfängst du? (wie oft wird ReadText aufgerufen)
...


hier wird ja nur ein einziges Byte gelesen, das sollte weniger als ein paar Millisekunden dauern.


Die Funktion wartet allerdings bis ein Zeichen am Port angekommen ist...
solange nichts kommt, wird natürlich gewartet.


Es wäre demnach wohl besser dieses in einen Thread auszulagern,
oder es asynchron laufen zu lassen (schau dir dazu mal an wofür der letzte Parameter dieser Funktion ist).
Bei deiner version schmeißt er mir:
[Pascal Fehler] Unit1.pas(321): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
in der ReadFile Zeile an den Kopf...

Das ganze läuft auf 9600,8,N,1 (standard)

Nochmal zu deiner Frage:
Ich bekomme per RS232 schnittstelle einen 0815 sting rein, welchen ich als "String" verarbeiten möchte.

Mfg
Tobi
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Problem mit ReadFile;

  Alt 19. Mär 2007, 01:04
Wenn du an der seriellen Schnittstelle mehr Zeichen auslesen willst als im Puffer anliegen, dann wartet ReadFile, bis die gewünschte Anzahl von Bytes vorliegen. Ich empfehle zur Verhinderung dessen den Zugriff per Overlapped IO. Siehe dazu näheres bei CreateFile() und dem entsprechenden Parameter. Ein Demoprogramm dazu ist dort mit verlinkt in der MSDN.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem mit ReadFile;

  Alt 19. Mär 2007, 02:28
also ohne @

Tja, ich ich nutze halt 'ne MSDN-konforme ReadFile-Definition.
und da ist es ein Pointer ... wärend Delphi 'nen Var-Parameter verendet (dat vergißt man schonmal)
Delphi-Quellcode:
function ReadText: char;
var
  nRead: dword;
begin
  if not ReadFile(ComFile, Result, 1, nRead, nil) then
    Result := 'a';
end;

Im Thread wartet ReadFile zwar auch, nur wird dann wenigstens der Hauptthread nicht blockiert.

Bei Asynchon/OverlappedIO kannst du ein z.B. TimeOut definieren und/oder wärend des Einlesens noch andere Dinge machen.
$2B or not $2B
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Problem mit ReadFile;

  Alt 19. Mär 2007, 02:35
Hab ne weile im Inet recherchiert. Es lag am Timeout... den von 1000 auf 10 runtergeschraubt und schon läuft alle schön flüssig!


Mfg
Tobi
Tobias
It's not a bug, it's a feature.
  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 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