![]() |
Problem mit ReadFile;
Delphi-Quellcode:
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.
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; Wie kann ich obrigen Code optimieren das das Prog. wieder flüssig läuft? Mfg Tobi |
Re: Problem mit ReadFile;
Also die Kurzfassung zu deinem Code wäre wohl dieser:
Delphi-Quellcode:
An der Funktion selber liegt es also nicht.
function ReadText: char;
var nRead: dword; begin if not ReadFile(ComFile, @result, 1, nRead, nil) then Result := 'a'; end; 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). |
Re: Problem mit ReadFile;
Zitat:
[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 |
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.
|
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. |
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 23:48 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