Чтение из потока в массив байт, не всегда заполняется массив

Рейтинг: 0Ответов: 1Опубликовано: 01.06.2011

Прошу прощения за название, не смог менее сумбурно. Исправите - спасибо) Ситуация такая. Есть Delphi7, есть array[1..16000] of char и есть поток stdout консольного (через CreateProcess) приложения. Код:

function readOutPart(var Buffer: array of char; hOutput:THANDLE):boolean;
var BytesReadNow, BytesReadTotal: Cardinal;
  rdSuccess: LongBool;
  n: integer;
begin
BytesReadTotal := 0;
BytesReadNow := 0;
BuffSize := 16000;

repeat
  WaitForInputIdle(hOutput, 100);
  rdSuccess := ReadFile(hOutput, Buffer[BytesReadTotal+1], BuffSize-BytesReadTotal, BytesReadNow, nil);
  inc(BytesReadTotal, BytesReadNow);
until ((BytesReadTotal+1 > BuffSize) OR (not rdSuccess));

Result := (BytesReadTotal+1 > BuffSize);
if not Result then
  for n := BytesReadTotal+1 to BuffSize do
    Buffer[n] := #0;
end;

И есть плавающая ошибка. Периодически последние (видимо, 100-2000) байт недописываются в массив (остаются предыдущие). Дампить массив "чтоб посмотреть" смысла нет - это куски байтового потока (дискретизация аналогового), соответственно на вид не замечу, где сбой.

Вывод с консоли правильный - вывод в файл/чтение из файла говорят, что все нормально, но нужен реалтайм. А реалтайме помехи. Возникает ошибка где-то в 2-3% проходов функций (при этом она возвращает true, т.е. читается ровно 16000 байт).

Да, это звук. Помехи выражаются в окончании текущего блока концом предыдущего.

ЗЫ: цикл сделан, потому как консоль выдает 8192 байта и ждет, пока их прочитают. ЗЗЫ: иногда вместо наслоения получается хрип/визг. Такое чувство, что некоторые куски читаются не из потока, а из какого-то рандомного куска памяти.

Ответы

▲ 1Принят

Попробуйте перед повторным использованием сделать fillchar или zeromemory (вроде правильно названия функций написал )