![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мерцание и Двойная Буферизация [D7, WinXP]
Паша555 © (2005-01-11 01:53:00)Помогите решить проблему.
На форме по таймеру происходит перемещение TLabel.
Без Двойной Буферизации - мерцание
При включении - недостаточная скорость перемещения метки....
При добавлении графики (TImage)на форму - еще более уменьшается скорость передвижения слова.....
Какими путями можно избежать всех вышеописанных минусов ?
(OpenGL или DirectX?????)
Заранее спасибо !
sniknik (2005-01-13 23:58:00) [1]> Даже если поставить sleep(1) все равно движется очень медленно.
> А если сделать, как я говорю - быстро.
> Вопрос: почему?
sleep это "засыпание" потока т.е. приостанов и передеча ресурсов другим, даже поставив sleep(0) ты как бы отдаеш управление другим потокам, естественно это медленнее чем даже весь твой цикл (тут я обсчитался, но я в обшем и не считал, так навскидку дал)
а за счет чего разница (почему)?... винда какая? диспетчер задач есть? открой его и посмотри на загруженность проца в том и другом случае...
у тебя, пустой в общемто код на 100% занимает систему, у меня на 0.001% (от машины будет зависеть, если вообще удастся увидеть)
а если у меня sleep убереш то получиш ту же самую скорость (кому оно нужно? прочитать не успееш, мелькает чтото) с той же загруженностью.
а от Application.ProcessMessages; (на что основной упор про неправильность) она практически не зависит.
> Да, Архангельского начитался =-)))))))))))
выброси, если еще не поздно. ;о)
bulkas (2005-01-13 22:33:00) [2]Я естественно попробывал.
Даже если поставить sleep(1) все равно движется очень медленно.
А если сделать, как я говорю - быстро.
Вопрос: почему?
Да, Архангельского начитался =-)))))))))))
sniknik (2005-01-13 20:53:00) [3]> Вобще потоки насколько я знаю нельзя использовать для изменения свойств визуальных компонентов.
через синхронизацию можно.
sniknik (2005-01-13 20:51:00) [4]> Вот прежде чем лупить куда не попадя слипы, проверь как это будет работать, я сам знаю как в книжке написано.
> Поставь слип, проверь, и увидишь в чем разница.
не горячись так. ;о)) и лучше сам проверь. мой вариант в отличии от твоего более правильный. (можеш спросить тут на форуме, да и на любом другом)
а книжки... ;о)) знаем такие, небось архангельского начитался... ;о))) (там еще и не то есть)
bulkas (2005-01-13 18:49:00) [5]Вобще потоки насколько я знаю нельзя использовать для изменения свойств визуальных компонентов.
И приведенный мной пример изначально неверен.
Но факт в том , что он работает и причем хорошо работает, но в том случае, если никакие другие процессы в программе не вызывают большую нагрузку.
Вопрос был как запустить бугущую строку быстро - я дал ответ.
bulkas (2005-01-13 18:35:00) [6]Вот прежде чем лупить куда не попадя слипы, проверь как это будет работать, я сам знаю как в книжке написано.
Поставь слип, проверь, и увидишь в чем разница.
sniknik (2005-01-13 09:03:00) [7]
> procedure TRunStringThread.Execute;
> var i:Integer;
> begin
> while true do
> begin
> Synchronize(MotionRunString);
> Application.ProcessMessages;
> for i:=0 to 2999999 do;
> end;
> end;
вот это очень криво, так в потоках не делают
(уже надоело обьяснять почему, поиши здесь ветки про потоки)
вот так будет правильнее
procedure TRunStringThread.Execute;
begin
while not terminated do begin
Synchronize(MotionRunString);
Sleep(10); //ну не знаю какой задержки он хотель допится тем пустым циклом, подбери
end;
end;
Kerk (2005-01-13 05:19:00) [8]Поручик © (13.01.05 2:00) [19]
НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗУЙ DELPHIX
а почему? звучит слишком категорично.
Паша555 (2005-01-13 04:47:00) [9]на сегодня все - уже голова не варит
Завтра думаю появятся :)
Поручик (2005-01-13 04:12:00) [10]В твоем случае, лучше не мараться с DelphiX, это безполезная трата времени, имхо. Тебе хватит и Canvas.
Какие еще вопросы?
Паша555 (2005-01-13 04:06:00) [11]Не ссорьтесь, парни :)
Все посмотрю все выучу, Вы только помогайте !!!
Спасибо за ответы
Обязательно попробую как сказал и Поручик и Bulkas
И DelphiX и GLScene раньше просматривал немного, что это такое представление имею немного.....
Мое мнение, насчет DelphiX - конечно что-то серьезное не сделать, но для решения мелких задач можно использовать....
Пишу что-тоо вроде игрушки ребенку для улучшения техники чтения...
Там со словами игра на реакцию....
Поручик (2005-01-13 02:44:00) [12]bulkas (13.01.05 2:17) [21]
Ты его хочешь посадить на DirectX, OpenGL или API, да он разбираться будет месяц, если не больше не вылазя из-за компа.
Ты читал эту ветку или нет? Наверное нет, посмотри первый пост.
> Радости от жизни-то по началу надо получать.
Вот пусть и получает - рисует на GDI
> Вот и пусть поюзает DelphiX.
Вот этого не надо, DelphiX - тупиковая фигня, ну поюзает, и это ему ничего не даст.
А так немного познакомится с устройством Windows
> Потом сам поймет когда надо перейти на более серьёзные
> вещи.
Это обязательно
bulkas (2005-01-13 02:17:00) [13]Да не надо гнать про дельфи икс, про движение картинок и т.п.
Человек еще толком дельфи не знает.
Ты его хочешь посадить на DirectX, OpenGL или API, да он разбираться будет месяц, если не больше не вылазя из-за компа.
Радости от жизни-то по началу надо получать.
Вот и пусть поюзает DelphiX.
Потом сам поймет когда надо перейти на более серьёзные вещи.
bulkas (2005-01-13 02:13:00) [14]Ну встречался ты или не встречался с потоками это дело твоё.
Я тебе предложил два варианта:
Поток или DelphiX.
Пример с потоком скинул тебе на мыло.
Но я тебе советую для начального уровня, если собираешься заниматься графикой освоить DelphiX.
Поручик (2005-01-13 02:00:00) [15]НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗУЙ DELPHIX
Это вторая заповедь программиста графики, после "не двигай image"
А что ты делаешь? Игру или еще что-то, расскажи.
Паша555 (2005-01-13 01:39:00) [16]Я с потоками еще ни разу не встречался (уровень у меня не тот....)
Может пример на fur_surfen@web.de скинете ????
Непонятно зачем панель....
Буду разбираться.........
Спасибо большое.
bulkas (2005-01-13 01:10:00) [17]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
StaticText1: TStaticText;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TRunStringThread = class(TThread)
procedure Execute; override;
procedure MotionRunString;
end;
var
Form1: TForm1;
RunStringThread:TRunStringThread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
RunStringThread:=TRunStringThread.Create(True);
RunStringThread.Priority := tpIdle;
RunStringThread.Resume;
end;
procedure TRunStringThread.Execute;
var i:Integer;
begin
while true do
begin
Synchronize(MotionRunString);
Application.ProcessMessages;
for i:=0 to 2999999 do;
end;
end;
procedure TRunStringThread.MotionRunString;
begin
Form1.StaticText1.Left:=Form1.StaticText1.Left-1;
if Form1.StaticText1.Left=-Form1.StaticText1.Width then Form1.StaticText1.Left:=Form1.Panel1.Width;
end;
end.
Cobalt (2005-01-13 01:04:00) [18]На мой взгляд - для такого случая проще использовать окно класса STATIC
bulkas (2005-01-13 00:37:00) [19]а вобще мыло напиши сброшу, посмотришь по человечески.
bulkas (2005-01-13 00:36:00) [20]вобще-то для несложных задач, советую испльзовать DelphiX, очень удобно и просто, описаний и хелпа - навалом.
ну а если хочешь морочиться стандартными средствами щас напишу.