11 / 11 / 9
Регистрация: 16.04.2015
Сообщений: 28
1

Поточные выводы растровой графики

06.10.2015, 13:58. Показов 470. Ответов 1
Метки нет (Все метки)

Всем моё почтенное приветствие

Суть задания: необходимо создать 3 потока, каждый из которых будет выводить своё изображение в окне. Всё это дело синхронизировать с помощью семафора.

Собственно, у меня почти получилось: 1-ый поток выводит картинку (2-ому и 3-ему семафор запрещает это делать в этот момент), отрабатывает и разрешает войти другому потоку. Всё работает ровно 3 раза. Когда последний поток выводит картинку, заходит 1-ый и уже ничего не выводит. Не могу понять, почему. Помогите разобраться, пожалуйста.

1. Это мой обработчик на сообщение создания окна. Здесь я загружаю изображения, создаю семафор и потоки, в которых в качестве параметра отправляю изображения в поточную функцию.
C++
1
2
3
4
5
6
7
8
case WM_CREATE:
        hBitmap[0] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
        hBitmap[1] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
        hBitmap[2] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP3));
        hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);
        for (int i = 0; i < 3; i++)
            ThreadId[i] = CreateThread(NULL, 0, MyThread, hBitmap[i], 0, NULL);
        break;
2. Сама поточная функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DWORD WINAPI MyThread(LPVOID param)
{
    while (1)
    {
        WaitForSingleObject(hSemaphore, INFINITE);
        curBitmap = (HBITMAP)param;
        InvalidateRect(hWnd, NULL, TRUE);
 
                //Мой дебаг :) Здесь всё отрабатывает так, как нужно.
        if (curBitmap == hBitmap[0])
            MessageBox(hWnd, TEXT("1 поток"), TEXT("Text"), MB_OK);
        else if (curBitmap == hBitmap[1])
            MessageBox(hWnd, TEXT("2 поток"), TEXT("Text"), MB_OK);
        else if (curBitmap == hBitmap[2])
            MessageBox(hWnd, TEXT("3 поток"), TEXT("Text"), MB_OK);
 
        Sleep(1000);
        ReleaseSemaphore(hSemaphore, 1, NULL);
    }
    return 0;
}
3. Ну и обработчик сообщения WM_PAINT:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        
        GetObject(curBitmap, sizeof(bm), &bm);
        hShadowDC = CreateCompatibleDC(hdc);
        SelectObject(hShadowDC, curBitmap);
 
        BitBlt(hdc, 100, 100, bm.bmWidth, bm.bmHeight, hShadowDC, 0, 0, SRCCOPY);
 
        DeleteObject(curBitmap);
        DeleteDC(hShadowDC);
        ReleaseDC(hwnd, hdc);
 
        EndPaint(hwnd, &ps);
        break;
Дело в том, что, вроде как, всё работает. Потоки синхронно отрабатывают, код в WM_PAINT тоже всегда работает, но вот только после первого прохода всех потоков происходит перерисовка окна, в которое уже ничего не рисуется.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2015, 13:58
Ответы с готовыми решениями:

Загрузка растровой графики
Здравствуйте! Начал разбираться с растровой графикой и с самого начала не могу понять, почему...

Поточные итераторы
Доброго всем времени суток. У Б. Страуструпа в книге, там где &quot;Итераторы потоков &quot; есть пример, в...

Трассировка растровой линии
Необходимо разработать алгоритм &quot;трассировки&quot; растровой линии. Допустим, у нас есть изображение...

Работа с растровой картой
Добрый вечер. Нужна ваша помощь. В наличии: карта города в виде .bmp файла, к нему файл привязки...

1
567 / 197 / 70
Регистрация: 25.05.2012
Сообщений: 816
06.10.2015, 18:29 2
Цитата Сообщение от radzko Посмотреть сообщение
DeleteObject(curBitmap);
Как оно будет рисоваться более одного раза, если вы удаляете объекты, которые нужно рисовать после первого рисования?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2015, 18:29

Работа с растровой картой
Добрый день. Такие вот дела, нужно написать что-то типо кустарного АИСГПТ, с картой и базой данных....

Реализация алгоритмов растровой развертки линий
Уважаемые форумчане, помогите исправить программу. При запуске программы вылетает exitcode=1. ...

Вывести поточные координаты курсора мыши относительно формы и экрана, при нажатии на кнопку-реверсное изменение кнопок мыши C++
доброй ночи, уважаемые программисты, умные школьники, преуспевающие студенты, а также все участники...

Посоветуйте пакет для работы с растровой графикой
Привет всем. Я делаю свою графическую капчу, и для ее реализации требуется пакет для работы с...

Прога для подсчёта площади фигуры в растровой картинке
Например сфотографировали сложную фигуру, наложили на неё систему координат, загнали в прогу, и...

Непонятен принцип работы алгоритма Брезенхэма для растровой развёртки окружности
Вот пример с википедии,непонятны следующие моменты(а конкретно на чём основан выбор...


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

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

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