2010-11-13 3 views
0

Я написал небольшую процедуру в сборке, чтобы нарисовать текст на экране (сначала он записывает в буфер, а затем копирует буфер на экран с помощью BitBlt) Функция работает хорошо, и она рисует каждый 25 мс, но я заметил, что использование памяти увеличивается со временем и значительно увеличивается. Во-первых, я попытался освободить буфер DC, а затем удалить растровое изображение, создав новый, чтобы узнать, освобождена ли память, но она не работает, есть ли способ уменьшить это использование памяти?Использование памяти во время процедуры рисования

вот мой код

backh dd 0 
bmph dd 0 
isless db 1 
zerod dd 0 

initmenu: 
      invoke GetDC,0 
      invoke CreateCompatibleDC,eax 
      mov [backh],eax 
      invoke GetDC,0 
      invoke CreateCompatibleBitmap,eax,140,250 
      mov [bmph],eax 
      invoke SelectObject,[backh],[bmph] 
      invoke SetBkMode,[backh],TRANSPARENT 
      invoke SetTextColor,[backh],33CC00h 
      retn 

updatescreen: 
     invoke GetDC,0 
     mov [zerod],eax 
     mov cl,[isless] 
     test cl,cl 
     jnz @f 
     invoke BitBlt,[zerod],0,0,140,250,[backh],0,0,SRCCOPY 
     jmp _updatescreenend 
     @@: 
     invoke BitBlt,[zerod],0,0,140,25,[backh],0,0,SRCCOPY 
     _updatescreenend: 
     invoke ReleaseDC,[zerod] 
     retn 
menuproc: 
      invoke Sleep,25 
      call updatemenu 
      jmp menuproc 

ответ

1

Вы должны освободить DC. Возможно, вы не сделали это правильно (в коде, который вы представили, значение DC потеряно к моменту возврата BitBlt).

Можете ли вы оценить, сколько памяти вы протекаете на итерацию?

+0

обновила функцию, но до сих пор просачивается память (добавлена ​​функция для освобождения постоянного тока, когда я вызвать функцию updatescreen , нет результатов) – user506998

+0

Вы вызываете функцию GetDC() 'дважды в initmenu. вы выпустили его дважды? – ruslik

1

решаемых проблемы, вместо ReleaseDC я должен использовать DeleteDC, информацию о MSDN не так ...

Смежные вопросы