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 Problem mit ReadFile; (https://www.delphipraxis.net/88650-problem-mit-readfile%3B.html)

EDatabaseError 18. Mär 2007 23:12


Problem mit ReadFile;
 
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

himitsu 18. Mär 2007 23:38

Re: Problem mit ReadFile;
 
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).

EDatabaseError 18. Mär 2007 23:51

Re: Problem mit ReadFile;
 
Zitat:

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

Muetze1 19. Mär 2007 00:04

Re: Problem mit ReadFile;
 
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.

himitsu 19. Mär 2007 01:28

Re: Problem mit ReadFile;
 
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.

EDatabaseError 19. Mär 2007 01:35

Re: Problem mit ReadFile;
 
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


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