2 / 2 / 0
Регистрация: 20.11.2010
Сообщений: 52
|
||||||
1 | ||||||
Следы от эллипса на форме при его движении (как здесь поможет многопоточность?)14.07.2012, 00:50. Показов 2755. Ответов 11
Метки нет Все метки)
(
При движении эллипс оставляет следы на форме. Мне посоветовали использовать два потока.
Цитирую слова: "Рисовать в основном потоке, а мир действует в другом - специальном. Запускаешь поток паралельно, ставишь ему приоритет High, и в нем пусть бесканецный цикл обходит мир. " Потоки я вроде разобрал и немного понял. Но вот как сделать то что мне сказали - не могу никак понять. ОБЪЯСНИТЕ ПОЖАЛУЙСТА. Мой код:
0
|
|
14.07.2012, 00:50 | |
Ответы с готовыми решениями:
11
Большая нагрузка и тормоза при движении картинки по форме При движении квадрата стирать его из предыдущей позиции Изменить цвет эллипса при его попадании в квадрат Определить максимальный угол между векторами скорости шарика при его движении. |
Почетный модератор
![]() |
|
14.07.2012, 02:21 | 2 |
iron-mik, еда к размышлению: проблема в этом - CreateGraphics(); (36 строчка)...
Не по теме: Откуда ж новички узнают об этом корявом пути, использование CreateGraphics в таймере... :scratch:
0
|
14.07.2012, 04:25 | 3 |
Вот тема - Движение окружности по форме - здесь есть ссылка на файл Moving.rar в котором ваша задача решена. Вам осталось только выдернуть её правильно.
0
|
2 / 2 / 0
Регистрация: 20.11.2010
Сообщений: 52
|
|
14.07.2012, 09:48 [ТС] | 4 |
Никак не могу понять в чем здесь проблема...
![]() Объясните пожалуйста, что вы имели ввиду. SSTREGG, и еще хотел спросить: В похожей теме которую предоставил мне уважаемый Mans7, вы говорили что кроме как варианта с потоками, можно использовать вариант с таймером: Предполагаю вариант с таймером - это как у меня? Добавлено через 2 минуты Mans7, Спасибо за пример. Вроде разобрался немного как с потоками. Однако заметил что всеравно у некоторых фигур немного остается остаточный след. В чем там может быть проблема?
0
|
14.07.2012, 09:51 | 5 |
Именно. А в примере с архивом в котором я прислал, там реализована пауза в параллельном потоке. На заметку: если вы будете делать такую же паузу в основном потоке, то программа будет "зависать" на Х миллисекунд. При "подвисании" параллельного потока, вы, будучи в основном, никаких изменений не видите. Потоки просто более функциональные, нежели таймеры.
В том примере, что я вам дал, я не увидел таких проблем. Вообще Вам стоит в таком случае почитать про Двойную буферизацию. Ссылка: MSDN - Двойная буферизация графики Ссылка: MSDN - Практическое руководство. Уменьшение эффекта дрожания изображения посредством двойной буферизации для форм и элементов управления Я лично этим не занимался, потому не скажу ничего больше про двойную буферизацию. Вообще такой метод рисования (который вы используете) очень неудобный, как вы, наверняка успели заметить. А если честно - он неграмотный совершенно. Технически вы рисуете круг, заливаете его. Потом стираете всё поле, снова рисуете. По-любому возможна реализация этих же целей более удобно и эффективно. Поищите более современные методы рисования, может быть, какие-нибудь сторонние библиотеки, или, если вы сможете нарисовать то что вам надо в каком-нибудь элементе управления (панель, пикчурбокс), то их можно легко двигать программно. Правда, опять таки, это только в теории, надо пробовать. Кстати я только щас об этом подумал - попробуйте нарисовать вашими методами что-то в Panel, а затем в таймере (или в потоке) двигайте панель изменением свойств Top и Left, или сразу Location. Интересно - будет ли такой же глюк? (при этом все clear и dispose вам уже не нужны будут)
0
|
2 / 2 / 0
Регистрация: 20.11.2010
Сообщений: 52
|
|
14.07.2012, 09:56 [ТС] | 6 |
Mans7, Извиняюсь, кажется я понял - это наверно не следы от объектов. Это просто одинаковая траектория движения и тот же самый цвет скорее всего. Верно?
Добавлено через 1 минуту Mans7, спасибо за инфу - почитаю.
0
|
14.07.2012, 10:06 | 7 |
Пожалуйста. А вот ещё, рекомендую потратить немного времени на ознакомление:
- не обращайте внимание что это для Delphi, в этой теме язык не нужен. - Тоже для Delphi но понять смысл можно. Не совсем. Почитайте то что я предложил, где-то там четко описывается что это и почему оно возникает. В общем теперь у Вас должен быть полный арсенал информации. =)
1
|
Почетный модератор
![]() |
||||||
14.07.2012, 12:04 | 8 | |||||
Какие потоки для такой задачи? (вопрос риторический)
![]()
1
|
14.07.2012, 12:27 | 9 | |||||||||||||||
В этом коде есть только один поток по умолчанию, и он основной. Его не надо нигде прописывать это простой основной поток. Если хотите сделать параллельный, то замените
0
|
2 / 2 / 0
Регистрация: 20.11.2010
Сообщений: 52
|
||||||
14.07.2012, 22:58 [ТС] | 10 | |||||
SSTREGG, Все работает, спасибо! ТОлько один вопрос: что дает использование using -
0
|
15.07.2012, 00:44 | 12 |
Можно и без него. Ключевое слово Using упрощает работу с объектами которые реализуют интерфейс IDisposable.
Интерфейс IDisposable содержит один метод .Dispose(), который используется для освобождения ресурсов, которые захватил объект. При использовании Using не обязательно явно вызывать .Dispose() для объекта. То есть он тут используется в целом для контроля памяти, выделяемой на перерисовку (clear) и заливку (fill). А ещё Using блоки делают код более читабельным и компактным.
1
|
15.07.2012, 00:44 | |
Помогаю со студенческими работами здесь
12
Как в листе Exel на форме в проекте убрать его меню при активизации?
Компонент пользователя и его свойства при размещении его на форме
Масса протона при движении и его масса покоя Как найти радиус-вектор эллипса для определенного угла отклонения от оси эллипса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |