|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.12.2010, 12:34 | #1 |
Пользователь
Регистрация: 12.05.2009
Сообщений: 28
|
Рисование отдельным потоком в классе. MFC. GDI+
Если я в цикле вызываю метод класса Car.ShowCar, передавая ему всё время новые координаты для рисования, то все работает. Но если я сделаю цикл на рисование в самом методе, то он уже ничего рисовать не хочет. Во время отладки увидел,
arg->g 0x003af0b0 {nativeGraphics=0x02b82f10 lastResult=ObjectBusy } Gdiplus::Graphics * arg->g 0x003af0b0 {nativeGraphics=0x00000000 lastResult=InvalidParameter } Gdiplus::Graphics * CCar Код:
Код:
|
14.12.2010, 17:31 | #2 |
Пользователь
Регистрация: 12.05.2009
Сообщений: 28
|
Неужели ни кто, не может сказать в чём дело?
|
14.12.2010, 19:30 | #3 |
Пользователь
Регистрация: 12.12.2010
Сообщений: 30
|
Код:
|
14.12.2010, 19:41 | #4 | |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Если я не ошибаюсь (а это возможно, т.к. я не уверен), то проблема может быть именно в этом:
Код:
1. arg - указатель на память, в принципе все нормально 2. g - это указатель на графический контекст GDI+ связанный с HDC, а вот HDC то это уже GUI, а рисовать GUI в отдельном потоке, жди беду. Решением данной проблемы может быть два пути: 1. Рисовать все в главном потоке, отказаться от дочернего потока (реализация через таймеры и др.) 2. Готовить Bitmap (объект GDI+ или тот же HBITMAP (объект GDI)) в главном потоке, после чего передавать указатель на него в дочерний поток, где создается графический контекст GDI+ связанный с данным Bitmap'ом, и соответственно производится отрисовка на данном Bitmap'e. После чего вызывать синхронизацию из дочернего потока в главный (тут надо разобраться), т.е. по сути передача управления главному потоку (методу/функции), который будет выводить (уже готовый и известный) Bitmap на созданный раннее и связанный с HDC окна, графический контекст GDI+. UPD: Цитата:
Последний раз редактировалось BOBAH13; 14.12.2010 в 20:24. |
|
14.12.2010, 20:08 | #5 |
Пользователь
Регистрация: 12.12.2010
Сообщений: 30
|
Точно. Создается до фига потоков, обращающися к одному НЕразделяемому(видимо) ресурсу.
Без синхронизации не обойтись... Либо сделать задержку побольше, чтобы потоки успевали завершаться (но это корявый способ =) ). 2BOBAH13: Ну конечно, так делать не следует, но для того, чтобы понять, из-за чего ошибка, все-таки можно временно себе позволить)) Последний раз редактировалось V0id; 14.12.2010 в 21:14. Причина: update |
14.12.2010, 21:43 | #6 |
Пользователь
Регистрация: 12.05.2009
Сообщений: 28
|
Эмм народ, вы не так поняли, когда создается куча потоков всё работает отлично, а если всё сделать в 1 потоке, где синхронизировать-то нечего, то уже хрен.
Те если комменты в коде расставлены, как в коде выше, где создается 1 вторичный поток(или как его ещё обозавать) и ничего нихрена не рисуется. А вот если ставить их так: CCar Код:
Код:
|
14.12.2010, 21:54 | #7 |
Пользователь
Регистрация: 12.05.2009
Сообщений: 28
|
Щас врубил эту прогу, где создается 1 вторичный поток и будучи растроенным, что эта хрень не пашет, начал очень бысто кликать кнопку запуска этого потока, в надежде, что она запахает и в результате, парочку раз у меня этот чертов треугольник отрисовался. Ну не пиздец-ли (
|
14.12.2010, 21:55 | #8 | |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Логика с первого взгляда запутана, трудно понять код. Еще раз глянул вверх
Цитата:
Исходя из этого, где то нарушена логика программы. А именно очередность создания и удаления графического контекста. Видимо при выполнении в нескольких потоках, происходит торможение главного (фиксация графического контекста), и этого времени хватает на выполнение графических действий. Эта же ситуация может вам выдавать и это Код:
Простое решение, это удостоверится что все потоки завершены, после чего разрешить закончить функцию void CThreadsCarDlg::OnBnClickedOk(). Более сложное решение, это пересмотреть логику приложения. UPD: Tesmont советую выражаться по нормальному. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рисование отдельным поток в классе. MFC. GDI+ | Tesmont | Помощь студентам | 0 | 14.12.2010 11:17 |
GDI+ рисование картинки с прозрачным бэкграундом | sashonk | Общие вопросы C/C++ | 1 | 15.11.2010 22:40 |
массив отдельным файлом | Izlom | Помощь студентам | 2 | 31.05.2010 17:25 |
Работа с отдельным клиентом | Rapala | Работа с сетью в Delphi | 10 | 31.03.2010 17:29 |
закачка файла отдельным потоком. | ZeitGeist7 | Общие вопросы Delphi | 12 | 26.02.2009 20:23 |