2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
|||||||||||
1 | |||||||||||
Передача в поток указателя на контекст устройства14.11.2013, 17:28. Просмотров 1309. Ответов 14
Метки нет Все метки)
(
Здравствуйте!
С потоками раньше дела не имел вовсе, но случилась необходимость освоить. Нужно передать в поток указатель на контекст устройства.
Пытался сделать с reinterpret_cast, получается какой-то бред. Помогите плз, как его [указатель] передать, а потом правильно получить, чтоб можно было рисовать... Добавлено через 11 часов 33 минуты Неужели это невозможно? Или, поставим вопрос по-другому - можно ли рисовать в потоке, а не в основной программе?
0
|
|
14.11.2013, 17:28 | |
Вывод целого в контекст устройства Как сделать прозрачный контекст устройства?? Как получить контекст устройства Bitmap? Как обрезать картинку выбраную в контекст устройства?
__________________
14
Помогаю в написании студенческих работ здесь. Записывайтесь на профессиональные курсы C++ разработчиков |
|
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
|
14.11.2013, 17:55 [ТС] | 3 |
Немного не понял,привести к LPVOID ДО(!) инициализации потока?
0
|
Заблокирован
|
|
14.11.2013, 17:58 | 4 |
AfxBeginThread(proc1, (LPVOID)dc); или как то так
Потом, ты уверен, что поток, откуда ты передаешь свой dc не завершается до того момента, как ты это принимаешь в другом? Если так - то указатель у тебя становится не валидным Добавлено через 1 минуту вот после этого, ты должен ждать, пока рисуешь поток получит dc и всё отрисует. Потом продолжаешь игру
0
|
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
||||||
14.11.2013, 18:02 [ТС] | 5 | |||||
Добавлено через 1 минуту Да, уверен, потому как передается из основного блока Добавлено через 1 минуту Идея состоит в том, чтобы второй поток занимался рисованием сам, в то время, как основная программа занималась своими делами
0
|
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
||||||||||||||||
14.11.2013, 18:14 [ТС] | 7 | |||||||||||||||
Пример "тестовый"
CMainWnd.h: Кликните здесь для просмотра всего текста
CMainWnd.cpp: Кликните здесь для просмотра всего текста
Добавлено через 7 минут Преобразование ВНУТРИ потока пытаюсь делать так:
0
|
Заблокирован
|
|
14.11.2013, 18:15 | 8 |
С убогим MFC не работал много лет. Но судя по всему, OnPait вызывается по аналогии с чистым WM_PAINT, тоесть просты вызывается эта функция, когда надо перерисовать окно.
Вот и смотри, вызвалась функция OnPaint, в ней создался поток, куда ты передал адрес (тоесть указатель) на девайс контекст AfxBeginThread(proc1, lPtr);, далее - создался твой поток, а он создаётся относительно долго и начал что то делать, но пока он создавался и пока ты в нём обратился к dc, твоя функция OnPaint уже вылетела, тоесть закончилась, она ж в другом потоке и во первых, по скольку твой CPaintDC dc(this); объявлен в функции OnPaint - после того, как она вылетит - указатель станет не валидным и пользоваться им в другом потоке уже нельзя... А во вторых... В общем сначала с первым реши. В данном случа рисовать в другом потоке нет никакого смысла, т.к. тебе надо дождаться после вот этого AfxBeginThread(proc1, lPtr); завершения рисующего потока и никакого профита ты не получишь. Андестенд ?
0
|
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
|
14.11.2013, 18:23 [ТС] | 9 |
Если честно, запутали окончательно. То есть читать-то я умею, но ваш абзац переваривал долго, но так и не переварил :-(
Мне нужно даже не столько рисовать в отдельном потоке, а рисовать (в бесконечном цикле) так, чтобы основное окно откликалось на действия пользователя (чтобы он мог нажимать кнопки, останавливать или запускать рисование). Ничего лучшего потоков не придумал... Добавлено через 1 минуту Или при слабых знаниях матчасти про это лучше забыть???
0
|
Заблокирован
|
|
14.11.2013, 18:29 | 10 |
А что ты рисуешь? GUI рисуется всегда в одном потоке... Последние версии DirectX что - то выдвигали про MULTITHREADED_RENDERING, но пока это бутафория... Рисуют в разных потоках, точнее не рисуют, а просчитывают, например, сцены в 3ds max... Ты что конкретно рисуешь? Где и чего в таком случае хочешь добиться?
P.S.: например в случае двойной буферизации - ты сначала целиком прорисовываешь кадр как хочешь, а потом меняешь его на передний, ну тоесть именно на экране пиксели загораются в одном потоке
0
|
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
|
14.11.2013, 18:32 [ТС] | 11 |
Имитация звездного неба, около 2000 объектов в списке. Положение и цвет - рандомно меняются.
Проблема в том, что когда запускаешь всю эту машину (while (1){}), пользователь теряет связь с программой.
0
|
Заблокирован
|
|
14.11.2013, 18:43 | 12 |
В общем тебе нужно главное окно - это GUI для общения с юзером и обязательно! другое окно, в котором ты будешь рисовать в отдельном потоке. Второе окно может быть чем угодно, отдельным окном - маленьким окошком на форме и тд ... Опиши, как выглядит твой интерфейс, я ушёл - через пару часов за комп сяду ))
0
|
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
|||||||||||
14.11.2013, 19:14 [ТС] | 13 | ||||||||||
В общем, при конструкции
[CPaintDC] CJbject m_hDC m_hAttribDC m_bPrinting А DC, полученный в основном блоке: CDC m_hWnd m_ps Это барахло есть в xdc (и с теми же значениями), но зарыто глубоко: xdc / [CPaintDC] / CDC Вот я и не могу понять, как до этого CDC добраться Добавлено через 8 минут А интерфейса как такового и нет. Окно (1000х800) плюс 2 кнопки (запуск анимации и остановка анимации). По крайне мере, так в теории (и моих желаниях). Без 2 кнопок проект работает и сейчас, но из-за закольцованности цикла нет взаимодействия с пользователем. Проект сложный (как для меня) - класс-родитель CMyPoint и несколько наследников. Для упрощения задачи я (для начала!) хотел бы сделать в таком же бесконечном цикле во втором потоке вывод точки с рандомными координатами и цветом. Причем при нажатии кнопки "Start" процесс запускался бы, а при нажатии на "Stop" - останавливался. Если получится это, получится и все остальное. В этом и нужна помощь профи - как можно это организовать? Причем, учитывая мой уровень, объясняйте "как для чайников" (подозреваю, такие просьбы уже в печенках сидят, так что в любом случае, спасибо, что тратите свое время). Добавлено через 19 минут При такой конструкции:
Кликните здесь для просмотра всего текста
---------------------------
Microsoft Visual C++ Runtime Library --------------------------- Debug Error! Program: ...documents\visual studio 2012\Projects\XTread\Debug\XTread.exe R6010 - abort() has been called (Press Retry to debug the application) --------------------------- Прервать Повтор Пропустить --------------------------- Я уж и не знаю, что делать...
0
|
Заблокирован
|
|
14.11.2013, 21:00 | 14 |
Я предлагаю для начала, ну как для чайника, делать без MFC.
Скидывай сюда проект - посмотрю что можно сделать ![]() Добавлено через 5 минут В двух словах в таких случаях делают следующее в главном цикле обработки сообщений: проверяют, если ли сообщение (GetMessage, PeekMessage) и только в случае - если его нет - вызывается функция Render например. Тоесть прорисовка графики идёт так сказать в idler time... Добавлено через 11 секунд тогда ничего не лочится
0
|
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 36
|
||||||||||||||||
15.11.2013, 19:58 [ТС] | 15 | |||||||||||||||
Искреннее спасибо. Вам вроде как это и не нужно, а все равно готовы помочь. Но хочу разобраться сам. Когда до чего-то доходишь сам и когда за тебя делают, - согласитесь, не одно и то же. Мне первое приятнее.
Единственное, о чем попрошу, сделайте микро-проект (по-возможности, разбитый на .h и .cpp файлы), который в отдельном потоке выводит точку с рандомными координатами, а в основной программе есть кнопка, к примеру, "PAUSE", по нажатию на которую вывод точек останавливается, а потом начинается вновь. А со своим проектом (который сейчас крутится в бесконечном while, я после повожусь сам. Это то, что своими силами сделать не могу - еще год назад я о C++ не имел не малейшего представления, и конструкции вида i*=2 меня страшили Теперь вот страшат потоки. В общем, спасибо P.S. если нужно, сброшу голый тестовый проект, на котором сейчас ковыряюсь, но не думаю, что там вы найдете что-то полезное :-) Добавлено через 20 часов 25 минут Допер сам!!!!!!!!!!!!!!!!!!!!!!!!!!!! Решение оказалось на удивление простым: 1. Объявили поток в .h:
Моя ошибка была (как я думаю) в том, что я пытался передать указатель на контекст устройства, а надо было указатель на объект класса (?) CMainWnd, из которого уже в самом потоке я и получил контекст устройства Спасибо всем, тему можно считать закрытой!!!
0
|
15.11.2013, 19:58 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Подхватить видео-поток от устройства передача указателя Передача указателя Передача указателя на функцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |