Главная страница
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.045 c
15-1143006803
SergP.
2006-03-22 08:53
2006.04.16
Еще раз о сканировании портов. ИМХО кто-то чего-то темнит...


2-1144160297
TimScorp
2006-04-04 18:18
2006.04.16
FreeReport 2.32


9-1128441067
Зм1й
2005-10-04 19:51
2006.04.16
Анатомия


2-1143886115
Raul
2006-04-01 14:08
2006.04.16
Как сделать индекс у объекта TImage переменной??


5-1129211071
Saraseko Maksim
2005-10-13 17:44
2006.04.16
Наследовать TCollectionEditor