Чтение из потока в массив байт, не всегда заполняется массив
Прошу прощения за название, не смог менее сумбурно. Исправите - спасибо) Ситуация такая. Есть 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 байта и ждет, пока их прочитают. ЗЗЫ: иногда вместо наслоения получается хрип/визг. Такое чувство, что некоторые куски читаются не из потока, а из какого-то рандомного куска памяти.