154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
1

Передача hdc в функцию

02.12.2014, 00:55. Показов 4536. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Рисую полигоны (Polygon, bdc, 3) на wm_paint. Полигонов много поэтому пытаюсь реализовать многопоточность. Разделяю массив полигонов на некоторое кол-во частей и хотел бы каждую часть обработать в отдельном потоке. Да не могу bdc передать. В этой теме написано, что hdc не может работать за пределами wm-paint. Но как бы я и не совсем выхожу за пределы. Что я упускаю? Как передать hdc функции без ошибки?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2014, 00:55
Ответы с готовыми решениями:

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает...

Передача объекта в функцию или функцию друга
Здравствуйте, уважаемые программисты :) К примеру есть такой код. #include <iostream> using...

Передача массива в функцию используя указатель на функцию
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать...

Передача двухмерного массива из функцию в функцию
Допустим у меня есть функция, в которой "генерируется" массив. Но нужно его передать в другую...

4
47 / 28 / 12
Регистрация: 23.01.2013
Сообщений: 125
02.12.2014, 01:04 2
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Как передать hdc функции без ошибки?
Просто брать и передавать в функцию. А какая ошибка появляется у вас?
1
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
02.12.2014, 01:22  [ТС] 3
Вот
Миниатюры
Передача hdc в функцию  
0
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
02.12.2014, 01:30  [ТС] 4
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
case WM_PAINT:
        {
            // Get dc here
            hdc = GetDC(hWnd);
 
            // Create a backbuffer here 
            bdc = CreateCompatibleDC(hdc);
 
            // Get the screen dimensions
            RECT client;
            GetClientRect(hWnd, &client);
 
            // Create bitmap
            HBITMAP backBuffer = CreateCompatibleBitmap(hdc, client.right - client.left, client.bottom - client.top);
 
            // Release it, because we no longer need it
            hdc = NULL;
            ReleaseDC(hWnd, hdc);           
 
            // Select the back dc as a current one and specify the screen dimensions
            HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0, 25, 205));
            HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 55));
 
            SelectObject(bdc, hPen);
            SelectObject(bdc, hBrush);
            SelectObject(bdc, backBuffer);
 
            Rectangle(bdc, client.left, client.top, client.right, client.bottom);
 
            POINT points[3];
            Face vertexFace;
            clock_t t1, t2;
            t1 = clock();
            
            for (unsigned i = 0; i < model->vertexFaces.size(); i++)
            {
                // Here we convert our points to Clip and Windowed Coordinates
                // and only then fetch the results
                if (Algorithms::FetchPolygons(&model->finalizedVertices[0], model->vertexFaces[i], points))
                {
                    //Polygon(bdc, points, 3);
                    func_threads.at(0) = thread(anyFunc2, bdc);
                }
            }
 
            t2 = clock();
            long elapsed = timediff(t1, t2);
 
 
            for (unsigned i = 0; i < func_threads.size(); i++)
            {
                //if (func_threads[i].joinable()) func_threads[i].join();
            }
            
            // Swap buffers     
            hdc = BeginPaint(hWnd, &ps);
            BitBlt(hdc, client.left, client.top, client.right, client.bottom, bdc, 0, 0, SRCCOPY);
            EndPaint(hWnd, &ps);
 
            // Delete all created objects from memory
            DeleteObject(backBuffer);
            DeleteObject(hBrush);
            DeleteObject(hPen);
            DeleteDC(bdc);
            break;
        }
Если вместо вызова функции рисую полигон, то всё рисуется.

Добавлено через 5 минут
Блин, я кадр. В массиве не было элементов просто. Простите парни, всё с функцией в порядке, стало быть. vector<thread> был пустой. Всё, пора спать мне!
0
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
07.12.2014, 03:57  [ТС] 5
Люди, мне удалось создать многопоточное рисование на hdc. Но есть проблема, которую не могу решить. Вот сам WM_PAINT
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
case WM_PAINT:
{
    // Get dc here
    hdc = GetDC(hWnd);
 
    // Create a backbuffer here 
    bdc = CreateCompatibleDC(hdc);
 
    // Get the screen dimensions
    RECT client;
    GetClientRect(hWnd, &client);
 
    // Create bitmap
    HBITMAP backBuffer = CreateCompatibleBitmap(hdc, client.right - client.left, client.bottom - client.top);
 
    // Release it, because we no longer need it
    hdc = NULL;
    ReleaseDC(hWnd, hdc);           
 
    // Select the back dc as a current one and specify the screen dimensions
    HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0, 25, 205));
    HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 55));
 
    SelectObject(bdc, hPen);
    SelectObject(bdc, hBrush);
    SelectObject(bdc, backBuffer);
 
    Rectangle(bdc, client.left, client.top, client.right, client.bottom);
    
    // Call some threads to draw polygons on our BDC
    for (unsigned i = 0; i < func_threads.size(); i++)
    {
        func_threads.at(i) = thread(anyFunс2, bdc, i);
    }
    
    // Wait until all threads finish their job
    for (unsigned i = 0; i < func_threads.size(); i++)
    {
        if (func_threads[i].joinable()) func_threads[i].join();
    }
 
    // Swap buffers     
    hdc = BeginPaint(hWnd, &ps);
    BitBlt(hdc, client.left, client.top, client.right, client.bottom, bdc, 0, 0, SRCCOPY);
    EndPaint(hWnd, &ps);
 
    // Delete all created objects from memory
    DeleteObject(backBuffer);
    DeleteObject(hBrush);
    DeleteObject(hPen);
    DeleteDC(bdc);
    break;
}
Вот функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void anyFunс2(HDC dc, int index)
{
    POINT points[3];
 
    for (unsigned i = index; i < model->vertexFaces.size(); i += fs)
    {
        // Here we convert our points to Clip and Windowed Coordinates
        // and only then fetch the results
        if (Algorithms::FetchPolygons(&model->finalizedVertices[0], model->vertexFaces[i], points))
        {
            Polygon(dc, points, 3);
        }
    }
}
Мой метод рисования заключается в чередовании потоков на каждый полигон. Например, у меня есть 3 потока. Значит первый поток рисует 0, 3, 6, 9 полигоны, второй поток рисует 1, 4, 7, 10, а третий - 2, 5, 8, 11. Потом всё копирую из bdc в hdc. Таким образом после методов Join() все полигоны должны быть написованы. Но на деле получается вот так (скрин прикрепил). У меня такое ощущение, что рисует только один из потоков, словно стирает всё предыдущее и рисует по новой. Пытался передать bdc по ссылке, но результат такой же. Почему не рисует все полигоны?
Миниатюры
Передача hdc в функцию  
0
07.12.2014, 03:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2014, 03:57
Помогаю со студенческими работами здесь

CreateDIBSection без hdc
Если аргумент iUsage функции CreateDIBSection равен DIB_PAL_COLORS, функция берет палитру из...

Переменная hdc не обьявлена
всплывает синее окошко и как только я щелкаю по области r1 левой кнопкой мыши пишет переменная hdc...

Как скопировать HBITMAP в HDC ?
Привет! Есть HDC от окна определённого размера. Есть HBITMAP от картинки намного меньшего размера....

Вывести рисунок из файла на HDC
как вывести рисунок из файла не прибегая к компонентам, т.е. есть HDC dc - на ней нарисовать.


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru