Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.041 c
2-1144092699
Kapris
2006-04-03 23:31
2006.04.16
как нарисовать полуокруг ?


2-1143782088
serg111111
2006-03-31 09:14
2006.04.16
Помогите с сервисом


3-1140256083
Kot_
2006-02-18 12:48
2006.04.16
Order by по символьному полю


2-1143973368
MVP
2006-04-02 14:22
2006.04.16
Объясните пожалуйста как пользоваться scanline и region?


3-1140616606
Olle
2006-02-22 16:56
2006.04.16
Ошибка записи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский