Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2

Отрисовка в разных потоках

26.11.2011, 02:02. Показов 6637. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, давайте делиться опытом, какой код наиболее грамотный.
Суть вопроса: В справке написано - нельзя, но как говорится, если очень
хочется - то можно.
Опытным путём я умудрился понять, что в потоках рисует более чем отлично.
Делаю так: создаю окно, в окне скрин, гружу парочку прозрачных спрайтов или создаю их в
имаджах и переделываю в спрайт(прогу уже выкладывал тут). Создаю поток, в котором эти
спрайты в бесконечном цикле многократно рисуются. Пользую функции:

DisplaySprite
DisplayTransparentSprite
DisplayTranslucentSprite


В основной программе сканирую клавиатуру, мышку и ВНИМАНИЕ!!!
очень осторожно сканирую события таким образом, чтобы в момент отрисови в потоке, не
вызывалась функция WindowEvent().
Так вот вопрос как при таком раскладе сделать так, чтобы нажав кнопку Win можно было выйти в
винду ( ReleaseMouse(1) ) и соответственно войти обратно без последствий( у меня либо появляется
серый экран взаместо рисуемой области, либо мыша приобретает форму весов и при клике на окно
не заходит обратно). Функцию WaitWindowEvent() я по понятным причинам не рассматриваю т.к. она
блокирует программу, а мне нужно, чтобы и в основной программе(не в потоке) мог что-то ещё
обрабатывать.

В потоке у меня примерно так:

Code
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
 Global NowDrawing, NoThreadDraw
 Procedure OtdPotok (*Prm)
  Repeat
 
        If NoThreadDraw = 0     ; Рисуем если допустимо
           NowDrawing = 1   ;  Оповещаем основную прогу, что рисуем
                                   ;   чтобы она не делала ничего "лишнего"
          ClearScreen($FFFFFF)  ;  Очистим экран белым
 
           For i = 1 To 20      ; Рисуем кучу спрайтиков сеткой, для теста
              For y = my To my + 750 Step 16: For x = mx To mx + 1200 Step 16
                  DisplaySprite(NewSPR, x, y)
              Next: Next
           Next
 
          SimpleCur ()   ; Нарисуем курсор
          FlipBuffers()
          ;Delay(1)           ;  Ожидание, думаю аппаратная отрисовка
                                 ;  может тут ещё какое-то время работать
                                 ;  Чисто предположение
           NowDrawing = 0  ; Оповестим программу, что она может делать
                                  ; всё, что запрещено во время отрисовки
          Delay(1)           ; Время на выполнение инструкций основной программой
      EndIf
 
  Until All_Threads_End
 EndProcedure
В основной программе примерно так:
Code
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
  MyThread = CreateThread (@OtdPotok(), 0)    ; Создать поток
  Delay(50)       ; Подождать пока он активируется
  ThreadPriority(MyThread, 32)   ;  Сделаем поток "ненасытным"
 
 
Repeat
   InputALL ()   ; Опрос клавы, мышки и калькуляция координат мышки(своя ф-ция)
 
     ; Если ничего не рисуем, то опросим окно на наличие событий
    If NowDrawing = 0
       Event = WindowEvent()
    EndIf
     ;  Вот с этим работает всё нормально, но нам это не нужно
     ;Event = WaitWindowEvent()
 
       If KeyboardReleased(219)   ;  Кнопка Win
         Repeat: Until NowDrawing = 0
         ReleaseMouse(1): FirstClick = 1: NoThreadDraw = 1
       EndIf
 
       ;  Вот эту вставку написал давно, поэтому немного подзабыл
       ;  что она делает, в программе без потоков она работает отлично
       Select Event 
          Case #PB_Event_CloseWindow: End     ; Закрыть окно
          Case #PB_Event_RestoreWindow
          Repeat: Until NowDrawing = 0
          ReleaseMouse(0): NoThreadDraw = 0
          Case 513                                        ; Возврат в программу
            Repeat: Until NowDrawing = 0
            ReleaseMouse(0)
            If FirstClick: SetMouseXY (WindowMouseX(f), WindowMouseY(f))
            NoThreadDraw = 0
            FirstClick = 0: EndIf
        EndSelect
 
  Delay(5)    ;  Чтобы прога не жрала весь процессор
Until KeyboardReleased(#PB_Key_Escape)
All_Threads_End = 1   ; Говорим потоку, чтобы он сворачивался
Delay(50)                 ; Время чтобы "убился" поток
Короче говоря, хочется узнать, как всё это заставить нормально работать, а если это
невозможно - убедиться в этом.
С потоками работал мало и многого не представляю, как использовать семафоры и мьютексы пока
не допёр, не очень хочется юзать какие-либо суперсложные механизмы...

Доп информация: Если убрать Delay в 36 строчке - прога заработает, но опять же, как тогда
в основной программе "что-либо делать"? Нужно, чтобы она и через такие промежутки могла
нормально среагировать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.11.2011, 02:02
Ответы с готовыми решениями:

Отрисовка в потоках
Подскажите пожалуйста где можно почитать? Нужно организовать отрисовку приведений и пакмана(в разных потоках)

Метод выполнить в 11 разных потоках, соответственно для разных входных массивов
Здравствуйте, начал потихоньку разбираться в многопоточном программирование и не могу до конца разобраться. Допустим есть некий метод в...

Циклы обработки сообщений разных форм в разных потоках
Здравствуйте! Подскажите как реализовать циклы обработки сообщений разных форм в разных потоках. У коде одной формы сделал так: ...

21
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
27.11.2011, 20:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
У меня на Geforce 6600 показывает 30 и 23 соотв.
На работе стоит быстрый комп, видюха не знаю какая, а проц iCore7. Там интересная закономерность высветилась:
При работе с потоками FPS практически мало зависит от кол-ва спрайтов на экране. Т.е при 1 спрайте ( в нижнем правом углу) значение 79, при всех спрайтах ( курсор в верхнем левом углу) значение FPS = 64.
А если код в одном потоке, то зависимость страшная - при полной нагрузке спрайтами FPS=240, а при 1 спрайте FPS=2010(!), т.е разница почти в 10 раз.

Но в любом случае в однопоточном режиме работает гораздо быстрее, это факт.
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
27.11.2011, 21:46  [ТС]
Pro_grammer, спасибо за ценную информацию.
Чем больше тестов, тем более объективную информацию мы сможем извлечь о работе этих двух программ.
Я изначально знал, что у второй FPS будет больше, правда не думал, что настолько.

Прога - далеко не идеал, может быть кто-то сможет её улучшить на благо всего pure сообщества.
Цель программы: показать принцип, использующийся при отрисовке в отдельном потоке, ну и
показать, что это не так уж невозможно как нам гласит справка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2011, 21:46
Помогаю со студенческими работами здесь

Изменение разных элементов вектора в разных потоках даёт отличный от join() результат, нежели при detach()
Имеется using V = vector&lt;double&gt;; using M = vector&lt;V&gt;; Есть функция матричного умножения A*B. На каждую вектор-строку матрицы A я...

ShellExecute в разных потоках
Возникла трудность с ShellExecute, делаю запуск telegramma из своего приложения с параметрами, все открывается параметры передаются, но...

Перменные в разных потоках
К примеру у меня есть поток со своей переменной внутри(+ я в создание потока даю значения) Thr1 = new Thread(delegate () { thrvd(1); }); ...

2 цикла в разных потоках
Здравствуйте! Научите! Как правильно делать &quot;что-то&quot; в отдельном фоновом потоке в C++. Пожалуйста код! К примеру: void...

QTimer в разных потоках
Вообщем у меня программа состоит из нескольких потоков. Дабы разгрузить граф поток и так же сымитировать несколько отдельных программ в...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru