Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 4

Двойная буферизация ( утечка памяти )

31.10.2012, 15:54. Показов 1340. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день .
В окне имеется прямоугольник, который постоянно меняет свою высоту.
При просмотре используемой памяти , диспетчер задач показывает постоянное увеличение потребляемой памяти. Как я понимаю кде-то остается , но где - никак не разберусь.
Подскажите пожалуйста.
Ниже прдставлен код - это просто пример


Заранее спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2012, 15:54
Ответы с готовыми решениями:

Двойная буферизация
Написал тетрис (но только с палочками (друг попросил сделать =) )) Писал на чистом WinAPI, в WM_PAINT происходит сначала отрисовка...

Двойная буферизация
Добрый день. Программа должна принимать текст с клавиатуры, выводить его на экран и реагировать на '+' и '-', увеличивая и уменьшая текст...

Двойная буферизация
Добрый день! Имеется обычное оконное приложение Win32, необходимо реализовать при рисовании механизм двойной буферизации. Вот мой код, по...

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
31.10.2012, 17:38
Где код-то?
0
0 / 0 / 0
Регистрация: 11.09.2012
Сообщений: 4
31.10.2012, 17:58  [ТС]
Ой , извиняюсь. Код забыл прикрутить :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <windows.h>
#include <cmath>
#define ID_TIMER_H 1000
#define IDC_BUTTON 100
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Code::Blocks Template Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static float visota;
    static float ugol;
    static HDC hdc;
 
    RECT rect;
    HBITMAP hBmp;
    PAINTSTRUCT ps;
    HWND hButton;
 
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            visota = 100; ugol = 0;
            hButton = CreateWindow( "button", "OK", WS_VISIBLE | WS_CHILD | BS_CENTER,
                                   20, 20, 100, 30, hwnd, ( HMENU ) IDC_BUTTON, GetModuleHandle( NULL ), 0 );
 
            break;
        case WM_COMMAND:
            switch( wParam )
            {
                case IDC_BUTTON:
                    SetTimer( hwnd, ID_TIMER_H, 30, 0 );
                    break;
            }
            break;
 
        case WM_PAINT:
            hdc= BeginPaint( hwnd, &ps );
 
            GetClientRect( hwnd, &rect );
            HDC hdcPic;
             hdcPic = CreateCompatibleDC( hdc );
 
          hBmp = CreateCompatibleBitmap(hdc, rect.right, rect.bottom );
           DeleteObject( SelectObject( hdcPic, hBmp ) ) ;
 
            HBRUSH brush;
            HBRUSH brushBack;
            brush = CreateSolidBrush( RGB( 255,0, 0 ) );
            brushBack = CreateSolidBrush( RGB( 255, 255, 255 ) );
            POINT point[ 4 ];
            point[0] = { 100, 300 };
            point[ 1 ] = { 200, 300 };
            point[ 2 ] = { 200, visota };
            point[ 3 ] = { 100, visota };
 
            FillRect( hdcPic, &rect, brushBack );
            DeleteObject( SelectObject( hdcPic, brush ) );
            Polygon( hdcPic, point, 4 );
            SaveDC( hdcPic );
            BitBlt(hdc, 0, 0, rect.right, rect.bottom, hdcPic, 0, 0, SRCCOPY );
            EndPaint( hwnd, &ps );
            DeleteObject( brush );
            DeleteObject( brushBack );
            ReleaseDC( hwnd, hdcPic );
            
            break;
        case WM_TIMER:
            switch( wParam )
            {
                case ID_TIMER_H:
                ugol += 0.02;
                visota = 100 + 50* sin( ugol );
                InvalidateRect( hwnd, 0, 0 );
                if( ugol > 6.28 )
                    KillTimer(hwnd, ID_TIMER_H );
                break;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
31.10.2012, 18:18
Лучший ответ Сообщение было отмечено volvo как решение

Решение

C++
1
2
3
4
5
// Во-первых, не забывай удалять hBmp:
DeleteObject (hBmp);
// А во-вторых, объект, созданный CreateCompatibleDC, удаляется
// не через ReleaseDC, а через 
DeleteDC(hdcPic);
, читаем MSDN внимательнее...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.10.2012, 18:18
Помогаю со студенческими работами здесь

Двойная буферизация графики
Дабы избавиться от мерцания изображения(фоновое изображение + побочные элементы + текс) прибегнул к использованию буферизации, проблема с...

Двойная буферизация не работает
почему то не работает Двойная Буферизация case WM_PAINT: { hdc=BeginPaint(hwnd,&amp;PaintStruct); GetClientRect(hwnd,&amp;rect); ...

Двойная буферизация в gdi+
Не могу разобраться, как правильно ее сделать. Есть функция: void createImage(wchar_t *path, int _abscissa, int _ordinate,...

Двойная буферизация консоли
У меня есть консольная программа(что-то типа игры) с картой, когда эта карта воспроизводится во время перемещения она мерцает. Не сочтите...

Двойная буферизация, мерцание
Всем привет! Пишу просто графическое приложение на чистом WinApi и никак не могу разобраться с двойной буфферизацией. Попробовал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru