Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Как организовать поток с графикой?   Найти похожие ветки 

 
Fed ©   (2005-11-09 00:32) [0]

Здравствуйте! Пишу курсовую по Delphi. Задача в том, чтобы нарисовать данный механизм и заставить его двигаться, также рассчитать скорости точек механизма.
 Движение механизма создается с помощью цикла рисования(и стирания) на  Canvas. Если выполнять рисование в основном потоке, то пока цикл не кончится на форма не реагирует на запросы(ни кнопку нажать, ни даже закрыть).
  Если выполнять в отдельном потоке (TThread), то в какой-то случайный момент времени цикл прерывается и dephi выдаёт что-то типа "Canvas does not allow drawing".
Если при организации потока используем Synchronize (а многие издания пишут что без него вообще нельзя), то повторяется ситуация с выполнением цикла в основном потоке, т.е. на время выполнения цикла форма недоступна.
   Был бы очень признателен, если бы кто-нибудь что-нибудь подсказал.


 
MBo ©   (2005-11-09 07:03) [1]

>т.е. на время выполнения цикла форма недоступна.
А не нужно синхронизировать все тело цикла.
Во вторичном потоке ведешь расчеты и отрисовку на битмап, а в синхронизируемом методе потока ТОЛЬКО быстренько копируешь битмап на форму.
Кстати, у TCanvas есть еще метод Lock - может пригодиться.


 
Eraser ©   (2005-11-09 19:35) [2]


> Fed ©   (09.11.05 00:32)

Так же советую прорисовку на форму осуществлять в событии OnPaint, а инициировать через вызов InvalidateRect.


 
Fed ©   (2005-11-14 11:51) [3]


> А не нужно синхронизировать все тело цикла.
> Во вторичном потоке ведешь расчеты и отрисовку на битмап,
>  а в синхронизируемом методе потока ТОЛЬКО быстренько копируешь
> битмап на форму.

Что-то все равно не работает :(
вот простенький пример (в самой проге расчеты гораздо ложнее)

//Основной модуль
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,unit2;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
 private
   T1:TMyClass;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 flg:boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
flg:=true;
T1:=TMyClass.Create(false);
end;

end.

//Модуль потока
unit Unit2;

interface

uses
 Classes,Windows, Messages, SysUtils, Variants,  Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TMyClass = class(TThread)
 private
 procedure Copy;
   { Private declarations }
 protected
   procedure Execute; override;
 end;
 Var Bitmap:TBitmap;

implementation
uses Unit1;

{ Important: Methods and properties of objects in visual components can only be
 used in a method called using Synchronize, for example,

     Synchronize(UpdateCaption);

 and UpdateCaption could look like,

   procedure TMyClass.UpdateCaption;
   begin
     Form1.Caption := "Updated in a thread";
   end; }

{ TMyClass }
procedure TMyClass.Copy;
var Rect1,Rect2:TRect;
begin
Rect1.Left:=0;
Rect1.Top:=0;
Rect1.Right:= Rect1.Left+150;
Rect1.Bottom:=Rect1.Top+150;
Rect2.Left:=0;
Rect2.Top:=0;
Rect2.Right:= Rect1.Left+150;
Rect2.Bottom:=Rect1.Top+150;
Form1.Canvas.BrushCopy(Rect1,Bitmap,Rect1,Form1.Color);
end;
procedure TMyClass.Execute;
var i:integer;
begin
with Bitmap do begin
Canvas.Pen.Color:=ClBlue;
i:=0;
While flg do begin
Canvas.Pen.Color:=clWhite;
Canvas.Ellipse(100+i-1,100,50+i-1,50);
Canvas.Pen.Color:=clBlue;
Canvas.Ellipse(100+i,100,50+i,50);
Synchronize(Copy);
i:=i+1;
 { Place thread code here }
end;
end;
end;

end.



Или я не так понял, может копировать не через BrushCopy?



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
15-1143462286
PZ
2006-03-27 16:24
2006.04.16
Информация для размышления


15-1142589089
Def
2006-03-17 12:51
2006.04.16
Как студенты манипулируют преподавателями


2-1143713097
Yegorchic
2006-03-30 14:04
2006.04.16
CheckBox.Caption в 2 строки


3-1140718781
bungle
2006-02-23 21:19
2006.04.16
Экспорт таблицы с автоинкрементным полем


2-1143987237
Ку Ку
2006-04-02 18:13
2006.04.16
SisTrey