Мое приложение разработано в Delphi 6. Это ресурсоемкое приложение из-за фоновой обработки и большого объема данных (оно потребляет около 60-120 МБ физической памяти). Одной из функций этого приложения является создание изображений штрих-кода после выполнения определенной обработки.
Если пользователь продолжает генерировать штрих-коды, то по крайней мере один из десяти штрих-кодов содержит пропущенные строки.
У нас есть следующие шаги в генерации вывода:
- Создание изображения штрих-кода (TImage) в памяти. Высота изображения составляет 10 пикселей. Мы используем пиксельный формат pf24bit.
- Изменение размера изображения в памяти в соответствии с холстом принтера и передача его на холст принтера.
Код для шага № 2 выглядит следующим образом:
procedure PrintBitmap(ARect:TRect; Bitmap:TBitmap);
var
Info: PBitmapInfo;
InfoSize: dword{Integer};
Image: Pointer;
ImageSize: dword{ integer};
iReturn : integer ;
iWidth,iHeight :integer;
begin
try
with Bitmap do
begin
iReturn := 1;
GetDIBSizes( Handle, InfoSize, ImageSize );
GetMem( Info, InfoSize );
try
getMem( Image, ImageSize );
try
GetDIB(Handle, Palette, Info^, Image^);
try
with Info^.bmiHeader do
begin
SetStretchBltMode(Printer.Canvas.handle,HALFTONE);
iReturn := **StretchDIBits**(Printer.Canvas.Handle, ARect.Left, ARect.Top,
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top,
0, 0, biWidth, biHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
end;
except on E:Exception do
begin
gobjLog.pWritetoLog(0,'RptWrks2','PrintBitmap','Exception in StretchDIBits with message '+e.Message);
end;
end
finally
FreeMem(Image, ImageSize);
end;
finally
FreeMem(Info, InfoSize);
end;
end
except on E:Exception do
begin
gobjLog.pWritetoLog(0,'RptWrks2','PrintBitmap','Exception in PrintBitMap with message '+e.Message);
end;
end;
Мы проверили, что проблема заключается в Шаге 2, так как изображение штрих-кода генерируется без каких-либо проблем. (Мы прокомментировали Шаг # 2 и приняли вывод в виде BMP-файлов, чтобы подтвердить это).
Кроме того, мы попробовали следующие обходные пути:
- Мы использовали компонент TExcellentImagePrinter для выполнения операции изменения размера. Но проблема не была решена.
- Мы включили вызов SETAPROCESSWORKINGSETSIZE WinAPI, чтобы уменьшить / обновить текущую память, используемую приложением.
- Мы включили Sleep (3000) в код, чтобы Windows могла выделить память для изображения. Однако включение Sleep уменьшило частоту появления этой ошибки.
Можете ли вы дать какие-либо предложения?