2011-12-08 4 views
1

Я использую redmon для перенаправления postscript в delphi для обработки.Redmon & capture stdin with Delphi

Я использую следующий код для чтения стандартного ввода в файл:

var 
    Stdin: THandleStream; 
    FStream: TFileStream; 
    BytesRead:Int64; 
    Buffer: array[0..1023] of Byte; 

StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); 
try 
    tempps:=GetTempFile('.ps'); 
    FStream:=tfilestream.Create(tempps,fmCreate or fmOpenReadWrite); 
    StdIn.Seek(0,0); 
    try 
    repeat 
     BytesRead:=StdIn.Read(Buffer,1024); 
     FStream.Write(Buffer,BytesRead); 
    until bytesread<SizeOf(Buffer); 
    finally 
    InputSize:=FStream.Size; 
    FStream.Free; 
    end; 
finally 
    StdIn.Free; 
end; 

Это работает в большинстве случаев, за исключением одного, где файл журнала Редмон показывает:

REDMON WritePort: OK count=65536 written=65536 

REDMON WritePort: Process not running. Returning TRUE. 
    Ignoring 65536 bytes 

Является ли тот факт, что это 65536 только красная селедка, и это то, что я не читаю stdin должным образом, или есть какой-то странный предел где-то я забыл?

Заранее спасибо.

Edit 1

65536 является отвлекающим маневром - RedMon печатает это сообщение каждый 64K в журнале, весь файл 688759 байт, однако выглядит как Редмон закрывает выход рано, но по-прежнему продолжает выводить все равно текст.

+0

Время для базовой отладки. Ваш процесс вообще запущен? Если да, то сколько данных оно прочитало? Сколько он должен был читать? Редмон часто генерирует * точно * 64 КБ данных? –

+1

Прошу вас, пожалуйста, перечислить лог-архив. –

ответ

3

Я не знаю, как работает RedMon, но я бы не полагаться на bytesread<SizeOf(Buffer) как условие EOF, потому что я полагаю, вы на самом деле чтение из трубы, и ReadFile функции в MSDN документации говорят могут возвращать число прочитанных байт меньше чем количество прочитанных байтов, если вы читаете из канала.

BytesRead <= 0 условие является более надежным (он может не только тогда, когда RedMon запишет 0 байт на другой стороне трубы, я полагаю, что не следует делать):

repeat 
    BytesRead:=StdIn.Read(Buffer,1024); 
    if BytesRead > 0 then 
    FStream.WriteBuffer(Buffer,BytesRead); 
until BytesRead <= 0; 
+0

Работал отлично, спасибо. –