![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
![]()
Я уже достаточно долго не могу понять, как иcпользовать методы canvas в потоке. Может кто нибудь объяснит это? Заранее благодарю.
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
![]()
canvas в теле потока работать правильно никогда не будет, да и вообще визуальные действия в теле потока нельзя делать, для того чтобы работло нужно из тела потока синхронно вызывать созданное событие
К примеру В форме задаем событие Код:
Последний раз редактировалось Aliens_wolfs; 02.03.2012 в 17:47. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
![]()
А можно на примере этого кода?
Код:
|
![]() |
![]() |
![]() |
#4 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
Подсказка: класс TBitmap тоже имеет Canvas
![]() Делайте любые действия в потоке с переменной типа TBitmap, а потом просто в потоковой процедуре присваивайте ваш битмап.канвас визуальной канве. Процедура должна вызываться методом Synchronize().
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
![]()
А как присвоить bitmap канве формы?
|
![]() |
![]() |
![]() |
#6 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
Канву присвоить прямо нельзя, но вот рисовать на канве битмап - можно
![]() Код:
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
![]()
Спасибо. Но у меня возникли новые проблемы. Фон image у меня стал белый, а нарисовать получается только один прямоугольник, хотя у меня код находится в цикле.
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
![]()
Спасибо. Но у меня появились новые проблемы. У меня получается в цикле нарисовать только один прямоугольник( я так понял это потому что не перерисовывается?), а фон image стал белым и другие фигуры заходят за него. Да и если уж так всё с потоками сложно с графикой, как рисовать в canvas много фигур, чтобы это всё не тормозило при движении другой фигуры?
Последний раз редактировалось demigod82; 04.03.2012 в 16:19. |
![]() |
![]() |
![]() |
#9 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
смысл в том, что ты рисуешь в потоке на канве БИТМАПА, а не формы! это разные вещи. Форма - визуальный VCl-компонент, и не ориентирован на многопоточность. С переменной типа TBitmap - другое дело, здесь ты в потоке работаешь с ней как с данными, не привязанными к чему-либо визуальному. Твоя ошибка скорее всего в неверном вызове процедуры синхронизации.
Например, в методе Execute твоего потока написать код работы с битмапом, а потом в нем же сделать такой вызов: Код:
Код:
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#10 | |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
![]() Цитата:
while not Terminated do а то процессор будет грузить даже когда Synchronize либо Sleep(10); либо WaitForSingleObject(FhEvent, 10); Цикл должен быть в теле потока. Примерно так Код:
Последний раз редактировалось Aliens_wolfs; 05.03.2012 в 09:08. |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
О подключаемых модулях, формах и потоках | bagos | Общие вопросы Delphi | 6 | 13.12.2010 19:53 |
синхронизация в потоках | xrob | Общие вопросы Delphi | 8 | 15.11.2010 17:25 |
Suspend и Resume в потоках (C#) | lot555 | C# (си шарп) | 0 | 31.10.2010 20:37 |