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

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

26.11.2011, 02:02. Показов 6909. Ответов 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 / 2840 / 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
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru