C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: 512M мало памяти?  (Прочитано 7099 раз)
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


512M мало памяти?
« : 12 Октябрь 2007, 09:54:22 »

система XPsp2
для такого кода нехватает памяти 
что мона сделать?
Код
  int i;
 Graphics::TBitmap *bmap=new Graphics::TBitmap;
 Printer()->Orientation=poLandscape;// poPortrait;
 bmap->Width=Printer()->PageWidth;
 bmap->Height=Printer()->PageHeight;
 
 bmap->Canvas->Pen->Width=1;
 for(i=0;ibmap->Width;i+=350)
 {
   bmap->Canvas->MoveTo(i,0);
   bmap->Canvas->LineTo(i,bmap->Height);
 }
 
 Printer()->BeginDoc();
   BitBlt(Printer()->Canvas->Handle,0,0,Printer()->PageWidth,Printer()->PageHeight,bmap->Canvas->Handle,0,0,SRCCOPY);
 Printer()->EndDoc();
 delete[] bmap;
Записан
VerZer
Участник


Сказали спасибо: +92/-10
Offline

Сообщений: 1138


Re: 512M мало памяти?
« Ответ #1 : 12 Октябрь 2007, 17:26:37 »

если нет необходимости создавать отдельный экземпляр TBitmap, можно рисовать непосредственно на холсте принтера
Записан
dimchik_b
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 95


Re: 512M мало памяти?
« Ответ #2 : 15 Октябрь 2007, 18:33:50 »

А можно узнать, почему delete[], а не delete?
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


Re: 512M мало памяти?
« Ответ #3 : 16 Октябрь 2007, 10:13:12 »

2dimchik_b в примере увидел - это не правильно

Цитата: VerZer от 12 Октябрь 2007, 17:26:37
если нет необходимости создавать отдельный экземпляр TBitmap, можно рисовать непосредственно на холсте принтера
нужно печатать графики с динамики
пробую превью написать
Записан
dimchik_b
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 95


Re: 512M мало памяти?
« Ответ #4 : 16 Октябрь 2007, 17:53:22 »

А в каком именно месте выкидывает "Недостаточно памяти"?
Записан
Asher
Администратор


Сказали спасибо: +111/-5
Offline

Сообщений: 425


Re: 512M мало памяти?
« Ответ #5 : 16 Октябрь 2007, 18:22:49 »

Привет.
Цитировать
пробую превью написать
а в чем смысл для PreView делать битмап с разрешением принтера? делайте с размерами окна отображения.

P.S. памяти не хватает по причине ее фрагментации. Не может операционка выделить один блок такого размера.
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


Re: 512M мало памяти?
« Ответ #6 : 29 Октябрь 2007, 12:40:37 »

2Asher
Цитировать
а в чем смысл для PreView делать битмап с разрешением принтера? делайте с размерами окна отображения.
хотелось сделать программу универсальней, а так как в разных принтерах разное dpi то и разное PageWidth,PageHeight.
Чем болеше значения, тем больше смогу вывести точек графика на печать.

Цитировать
P.S. памяти не хватает по причине ее фрагментации. Не может операционка выделить один блок такого размера.
2dimchik_b
Цитировать
А в каком именно месте выкидывает "Недостаточно памяти"?
меня это тоже заитересовало, провел научное изыскание  , на нобелевскую премию не потянет но может кому и пригодиться

тестировал на таком коде
создал переносимый экзешник
Код
  Printer()->Orientation=poLandscape;
 
 Printer()->BeginDoc();
 Graphics::TBitmap *bmap=new Graphics::TBitmap;
 bmap->Width=Printer()->PageWidth;
 bmap->Height=Printer()->PageHeight;
 
 Printer()->Canvas->Pen->Width=1;
 for(int i=0;ibmap->Width;i+=350)
 {
   bmap->Canvas->MoveTo(i+350,0);
   bmap->Canvas->LineTo(i,bmap->Height);
 }
 BitBlt(Printer()->Canvas->Handle,0,0,Printer()->PageWidth,Printer()->PageHeight,bmap->Canvas->Handle,0,0,SRCCOPY);
 
 delete bmap;
 Printer()->EndDoc();

проц                 память    операционка    принтер                результат
Sempron 3GHz  512M       WinXPsp2         Canon LBP 2900           
Intel Core 2       2G          WinXPsp2         Canon LBP 2900           
AMD 900MHz     256M       WinXP              Epson R300                 
AMD 900MHz     256M       WinXP              HP LaserJet 1010         
AMD 900MHz     256M       WinXP              Canon LBP 1120           
Pentium 3GHz    1G           WinXPsp2         Canon LBP 1120           
Intel Core 2       2G          WinXPsp1         Canon LBP 1120           
AMD 2GHz         256М      WinXPsp2          HP DeskJet 500           
AMD 2GHz         256М      WinXPsp2          Canon IP5200             
Celeron 500       128M      Win98               HP DeskJet 500           
Celeron 500       128M      Win98               Canon IP5200             

вывод: ХЗ
подозреваю что есть зависимость от памяти принтера

P.S. народ, если у кого есть доступ к матричникам поновее(Epson LX300,Epson 2180, OKI Microline , и т.д.) для работы надо, заранее спасибо
Записан
GoodWin
Давний друг


Сказали спасибо: +0/-0
Offline

Сообщений: 35


Re: 512M мало памяти?
« Ответ #7 : 30 Октябрь 2007, 09:13:24 »

Надо создавать bmp с помощью

 HDC hBitHDC = CreateCompatibleDC( Printer()->Handle );
 HBITMAP  FhBitmap = CreateCompatibleBitmap( Printer()->Handle , Printer()->PageWidth , Printer()->PageHeight );
 SelectObject( hBitHDC , FhBitmap );

 //рисуем на hBitHDC

 //Копируем на принтер, например с помощью BitBlt

  if ( hBitHDC )
  {  DeleteDC( hBitHDC ); hBitHDC = NULL; }
 if ( FhBitmap  )
  {  DeleteObject( FhBitmap ); FhBitmap = NULL; }

TBitmap почему то не поддерживает размер ,помоему больше размеров экрана


Записан
Asher
Администратор


Сказали спасибо: +111/-5
Offline

Сообщений: 425


Re: 512M мало памяти?
« Ответ #8 : 30 Октябрь 2007, 11:53:08 »

Привет.

Повторяю еще раз.
В чем смысл делать канву для предпросмотра с разрешением принтера?
все равно на экране ничего не увидите.
Есть функция отрисовки, которая работает в координатах переданного холста.
Для предпросмотра - передаете ей канву и размеры битмапа, для печати - канву и размеры принтера и рисуете сразу на ней.
Все.
Записан
dimchik_b
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 95


Re: 512M мало памяти?
« Ответ #9 : 31 Октябрь 2007, 12:45:10 »

Мой вопрос состоял в том, что в какой именно строчке программы возникает исключение? То есть ставить точки останова и смотреть: вылетит - не вылетит. И тогда уже решать, где мало памяти. А все соображения о ненужности рисования в разрешении принтера - правильные
Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


Re: 512M мало памяти?
« Ответ #10 : 31 Октябрь 2007, 16:00:11 »

2Asher
Цитировать
В чем смысл делать канву для предпросмотра с разрешением принтера?
остановился на том, что Stretch рисунка лучше сделать на сжатие(для экрана), так не теряется качество печати.

2dimchik_b
Цитировать
Мой вопрос состоял в том, что в какой именно строчке программы возникает исключение?
программа работает.
в зависимости от конфигурации(кампа и принтера) разная реакция: где нормально, где вобще не реагирует, где чистый лист, где на недостаток памяти

p.s.  идеальным остается рисование на прямую, но тогда все надо повторно прорисовывать
p.p.s. народ, если у кого есть доступ к матричникам поновее(Epson LX300,Epson 2180, OKI Microline , и т.д.) для работы надо, заранее спасибо
Записан
Termi_uc
Давний друг


Сказали спасибо: +1/-0
Offline

Сообщений: 86


Re: 512M мало памяти?
« Ответ #11 : 31 Октябрь 2007, 16:36:38 »

Во первых, ошибка с нехваткой памяти возникает потому, что ты пытаешься выделить
4 * Printer()->PageWidth * Printer()->PageHeight байт памяти
Код:
Graphics::TBitmap *bmap=new Graphics::TBitmap;
  bmap->Width=Printer()->PageWidth;
  bmap->Height=Printer()->PageHeight;//в этой строчке
на моем принтере (домашний, лазерник) это 64 метра.
На плотере это несоразмерно больше. Именно поэтому возникает ошибка с нехваткой памяти.

Во вторых, зачем выделять память под всю картинку сразу? Выводи по частям, и при превью и на принтер.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: 512M мало памяти?
« Ответ #12 : 05 Ноябрь 2007, 03:41:33 »

Еще есть малоизвестный баг (напарывался неск раз) - после создания TBitmap надо всегда обновлять PixelFormat,
даже если по умолчанию он уже нужный стоит. Иначе изредка случается Fatal.

Если фото печатать не будут - ставьте pf8bit (самый быстрый режим), или вообще pf1bit..pf4bit.
Заодно и памяти меньше нужно на порядок.



Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: 512M мало памяти?
« Ответ #13 : 23 Июль 2008, 17:09:58 »

Подниму старую темку...
Рисую на канве размерами 23 000х13 000, что весьма мне мало...
хотелось бы увеличить раз эдак в 10.

какими компонентами такое можно сотворить, или как сделать векторную графику?
Записан
Yurkins
Участник


Сказали спасибо: +36/-3
Offline

Сообщений: 368


Re: 512M мало памяти?
« Ответ #14 : 23 Июль 2008, 19:09:03 »

Цитата: oxotnik от 23 Июль 2008, 17:09:58
Подниму старую темку...
Рисую на канве размерами 23 000х13 000, что весьма мне мало...
хотелось бы увеличить раз эдак в 10.

какими компонентами такое можно сотворить, или как сделать векторную графику?
ImageEn
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: 512M мало памяти?
« Ответ #15 : 24 Июль 2008, 09:24:07 »

2 Yurkins Благодарю!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.121 секунд. Запросов: 22.