Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.77.114] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Написал маленькое диалоговое приложение для проверки работы с CBitmap под ХР и семеркой.
На диалоге есть кнопка, по нажатию на которую производится работа с CBitmap: void CProvCBitmapDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here CString s; char buf[300]; CBitmap bm; BOOL Rez=bm.CreateBitmap( Razm, Razm, 0,0, NULL); if (Rez==FALSE) { DWORD Er=GetLastError(); sprintf_s(buf, sizeof(buf), "Er=%d", Er); s="Ошибка при создании битмапа "; s=s+(LPCTSTR)buf; AfxMessageBox(s); }; sprintf_s(buf, sizeof(buf), "Razm=%d", Razm); s=buf; m_Razm.SetWindowText(s); Razm=Razm+1000; } При Razm равном 43000 еще работает, при следующем значении уже не работает, выдает сообщение ERROR_NOT_ENOUGH_MEMORY 8 Not enough storage is available to process this command. Я смотрел при работе программки смотрел диспетчер задач, размер памяти программы не превышает 13 мегабайт! Проблема проявляется только под ХР, под семеркой проблемы нет. Как исправить? Где грабли? Надо под ХР! |
Сообщ.
#2
,
|
|
|
> 43000 * 43000 * 4 / 1024 / 1024 / 1024 6.888061761856079 6 ГБ памяти надо под такую картинку это W * H * PX_SIZE / toKB / toMB / toGB не знаю, какая там глубина цвета по-дефолту, если не 4, а, например, 1, - будет около 2 ГБ, что близко к пороговому значению, которое может выделить x86-ось процессу. |
Сообщ.
#3
,
|
|
|
Тогда почему в диспетчере задач памяти указано только 13 Мб? Может эта картинка сжата? Если сжата, а там все нули, то и получится совсем небольшая память?
|
Сообщ.
#4
,
|
|
|
А если поставить точку останова после CreateBitmap и посмотреть на занятую память в этот момент?
|
Сообщ.
#5
,
|
|
|
Я об этом тоже подумал, добавил оператор AfxMessageBox(_T("Память выделилась")); Результат тот же. Или я где то ошибся?
|
Сообщ.
#6
,
|
|
|
Цитата a_n_y_a @ Я об этом тоже подумал, добавил оператор AfxMessageBox(_T("Память выделилась")); Результат тот же. Или я где то ошибся? Не обязательно памяти должно выделятся столько, сколько у тебя оперативы. Во первых под картинку скорее всего нужен массив. А это значит что ей нужно цельный блок выделить под твою картинку, если она такого блока не нашла - значит будет ошибка выделения памяти. |
Сообщ.
#7
,
|
|
|
Сейчас провел еще один эксперимент, изменил код так:
void CProvCBitmapDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here CString s; char buf[300]; CBitmap bm; BOOL Rez=bm.CreateBitmap( Razm, Razm, 0,0, NULL); if (Rez==FALSE) { DWORD Er=GetLastError(); sprintf_s(buf, sizeof(buf), "Er=%d", Er); s="Ошибка при создании битмапа "; s=s+(LPCTSTR)buf; AfxMessageBox(s); } else AfxMessageBox(_T("Битмап создался.")); sprintf_s(buf, sizeof(buf), "Razm=%d", Razm); s=buf; m_Razm.SetWindowText(s); Razm=Razm+1000; } На картинке скриншот с моей программкой и диспетчером задач. Вот что получилось: Прикреплённая картинка
|
Сообщ.
#8
,
|
|
|
ну все нормуль?
|
Сообщ.
#9
,
|
|
|
Цитата Cfon @ ну все нормуль? На скриншоте картинка 20000х20000=400 000 000 пикселей, даже если по одному биту на пиксель, получим 50 Мб памяти, а в диспетчере задач программа занимает 3.5 Мб. Где делись эти минимум 50 Мб? |
Сообщ.
#10
,
|
|
|
Смотри на общее потребление оперативной памяти, а не на память конкретного процесса.
|
Сообщ.
#11
,
|
|
|
Цитата a_n_y_a @ Где делись эти минимум 50 Мб? Попробуй ещё чем-нибудь посмотреть цифры. Например, ProcessExplorer-ом. Есть ещё исходники для известной книги Рихтера. Там есть 2 утилиты - ProcessInfo+vmapp, работающие вместе. Vmapp подробно покажет, как используется виртуальная память процесса, что/куда загружено, где свободно итд итп. |
Сообщ.
#12
,
|
|
|
Цитата a_n_y_a @ На скриншоте картинка 20000х20000=400 000 000 пикселей, даже если по одному биту на пиксель, получим 50 Мб памяти, а в диспетчере задач программа занимает 3.5 Мб. Где делись эти минимум 50 Мб? тебе зачем? хочешь вернуть? |
Сообщ.
#13
,
|
|
|
я тут причесал твой гавнокод
void CProvCBitmapDlg::OnBnClickedButton1() { CString s(L"Битмап создался."); CBitmap bm; BOOL Rez = bm.CreateBitmap(Razm, Razm, 0, 0, NULL); if (!Rez) { DWORD Er = GetLastError(); s.Format(L"Ошибка при создании битмапа Er=%d", Er); } AfxMessageBox(s); s.Format(_T("Razm=%d"), Razm); SetDlgItemText(IDC_LABEL, s); Razm += 1000; } |
Сообщ.
#14
,
|
|
|
Ну тогда и L"Битмап создался." лучше в else засунуть, дабы лишний раз не присваивать в случае неуспеха...
|
Сообщ.
#15
,
|
|
|
пускай так, я просто не люблю ветвления
|