|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.03.2012, 17:09 | #1 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
Canvas в потоках
Я уже достаточно долго не могу понять, как иcпользовать методы canvas в потоке. Может кто нибудь объяснит это? Заранее благодарю.
|
02.03.2012, 17:31 | #2 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
canvas в теле потока работать правильно никогда не будет, да и вообще визуальные действия в теле потока нельзя делать, для того чтобы работло нужно из тела потока синхронно вызывать созданное событие
К примеру В форме задаем событие Код:
Последний раз редактировалось Aliens_wolfs; 02.03.2012 в 17:47. |
02.03.2012, 18:00 | #3 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
А можно на примере этого кода?
Код:
|
02.03.2012, 19:54 | #4 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Подсказка: класс TBitmap тоже имеет Canvas
Делайте любые действия в потоке с переменной типа TBitmap, а потом просто в потоковой процедуре присваивайте ваш битмап.канвас визуальной канве. Процедура должна вызываться методом Synchronize().
"ковыряю изнутри" (с)
|
04.03.2012, 12:37 | #5 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
А как присвоить bitmap канве формы?
|
04.03.2012, 14:39 | #6 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Канву присвоить прямо нельзя, но вот рисовать на канве битмап - можно
Код:
"ковыряю изнутри" (с)
|
04.03.2012, 15:38 | #7 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
Спасибо. Но у меня возникли новые проблемы. Фон image у меня стал белый, а нарисовать получается только один прямоугольник, хотя у меня код находится в цикле.
|
04.03.2012, 16:03 | #8 |
Пользователь
Регистрация: 16.01.2012
Сообщений: 35
|
Спасибо. Но у меня появились новые проблемы. У меня получается в цикле нарисовать только один прямоугольник( я так понял это потому что не перерисовывается?), а фон image стал белым и другие фигуры заходят за него. Да и если уж так всё с потоками сложно с графикой, как рисовать в canvas много фигур, чтобы это всё не тормозило при движении другой фигуры?
Последний раз редактировалось demigod82; 04.03.2012 в 16:19. |
04.03.2012, 19:34 | #9 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
смысл в том, что ты рисуешь в потоке на канве БИТМАПА, а не формы! это разные вещи. Форма - визуальный VCl-компонент, и не ориентирован на многопоточность. С переменной типа TBitmap - другое дело, здесь ты в потоке работаешь с ней как с данными, не привязанными к чему-либо визуальному. Твоя ошибка скорее всего в неверном вызове процедуры синхронизации.
Например, в методе Execute твоего потока написать код работы с битмапом, а потом в нем же сделать такой вызов: Код:
Код:
"ковыряю изнутри" (с)
|
05.03.2012, 08:51 | #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 |