View Full Version : سوال: استفاده از Thread در Component
hajibandeh
شنبه 27 مهر 1387, 12:00 عصر
سلام به دوستان
آیا میشود در Component از Thread استفاده کرد اگر میشود چگونه ؟
hajibandeh
شنبه 27 مهر 1387, 12:29 عصر
کسی هست که جواب را بدونه ؟
shervin farzin
شنبه 27 مهر 1387, 13:24 عصر
سلام
من اين كارو انجام ندادم ولي به هر حال خصوصيات هر Component هم چه در حالت خوندن چه
در حالت نوشتن دارن با توابع كار ميكنن و منطقي به نظر مياد كه موقعي كه براي Component
خودتون توابعش رو مينويسين ، پروسه مورد نظرتون رو درون يه نخ قرار بدين .
موفق باشيد .
hajibandeh
یک شنبه 28 مهر 1387, 09:53 صبح
این کار را کردم ولی نمیدونم چه جوری خواص کامپوننت را درون ترد تعریف کنم
مثلا قراره یک ترد به نام رفرش داشته باشم که قراره در خاصیت Canvas کامپوننت من یک شکل را بکشه
هر روشی را امتهان کردم تا Canvas را درون ترد تعریف کنم ولی نشده
به طور کلی هر ترد میبایست خاصیتهای کامپوننت را بشناسد تا بتواند دستورات خود را اعمال کند
اشکال کار من در این است که نمیتوانم این کار را بکنم
vcldeveloper
یک شنبه 28 مهر 1387, 15:38 عصر
کامپوننت میتونه در داخل خودش از Thread استفاده کنه. Canvas هم Thread-Safe هست، البته باید همیشه کدهای مربوط به آن را که در Thread مینویسید بین دو فراخوانی Lock و UnLock باشند.
سوال شما برای من واضح نیست، نمیدونم چیکار میخواید بکنید، چرا از Canvas استفاده می کنید، و چطور Canvas را ساختید. آیا اصلا به Handleاش مقدار دادید یا نه.
hajibandeh
سه شنبه 30 مهر 1387, 09:11 صبح
اگر لطف کنید و بگویید چگونه میشود procedure Refresh را درون یک ترد اجرا کرد سپاسگذارم
unit TestComponent;
interface
uses
SysUtils, Classes, Controls, ExtCtrls, Graphics;
type
TTestComponent = class(TImage)
private
{ Private declarations }
FCaption:TCaption;
protected
{ Protected declarations }
procedure SetCaption(Value:TCaption);
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure Refresh;
published
{ Published declarations }
property Caption:TCaption read FCaption write SetCaption;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Ghiam', [TTestComponent]);
end;
{ TTestComponent }
constructor TTestComponent.Create(AOwner: TComponent);
begin
inherited;
Refresh;
end;
procedure TTestComponent.Refresh;
var
W,H,TW,TH:Integer;
B:TBitmap;
begin
W:=Self.Width;
H:=Self.Height;
B:=TBitmap.Create;
B.Width:=W;
B.Height:=H;
with B.Canvas do
begin
Pen.Color:=clBlack;
Brush.Color:=clYellow;
Rectangle(0,0,W,H);
TW:=(W div 2)-(TextWidth(FCaption)div 2);
TH:=(H div 2)-(TextHeight(FCaption)div 2);
TextOut(Tw,TH,FCaption);
end;
Self.Picture.Graphic:=B;
B.Free;
end;
procedure TTestComponent.SetCaption(Value: TCaption);
begin
FCaption:=Value;
Refresh;
end;
end.
hajibandeh
سه شنبه 30 مهر 1387, 09:13 صبح
البطه من از Canvas به این شکل استفاده نمیکنم ولی چارچوب کلی کامپوننت من به این شکل است
vcldeveloper
سه شنبه 30 مهر 1387, 17:12 عصر
استفاده از Refresh در Thread معنی نداره، چون Refresh همیشه توسط Thread اصلی انجام میشه. در ضمن، گفتم که Canvas در صورتی Thread-safe هست که کدهای مربوط به آن بین فراخواین متدهای Canvas.Lock و Canvas.Unlock قرار گرفته باشه.
شما بهتر هست بگید که دقیقا میخواید چکار کنید، و اصلا چرا می خواستید از Thread استفاده کنید. فکر کنم اونطوری بهتر بشه به شما کمک کرد.
hajibandeh
دوشنبه 06 آبان 1387, 11:32 صبح
جناب آقای کشاورز دمت گرم
با متد Lock و UnLock مشکلم حل شد
hajibandeh
یک شنبه 19 آبان 1387, 10:37 صبح
حالا کاری به کنواس ندارم
چه جوری میشه تو کامپوننت یه ترد ساخت و از اون استفاده کرد
vcldeveloper
یک شنبه 19 آبان 1387, 16:23 عصر
حالا کاری به کنواس ندارم
چه جوری میشه تو کامپوننت یه ترد ساخت و از اون استفاده کرد
همونجوری که یک کلاس Thread میسازید و ازش در فرم استفاده می کنید؛ یعنی اول کلاس Thread مربوطه را میسازید، و بعد یک شی از آن را به عنوان یکی از فیلدهای کلاس کامپوننت خودتان تعریف می کنید، و ازش استفاده می کنید.
یا بجای استفاده از TThread تمام کارهای مربوط به Thread را با استفاده از Windows API انجام میدید.
hajibandeh
شنبه 09 آذر 1387, 09:01 صبح
شرمندم جناب کشاورز متوجه نشدم
اکه میشه 1 مثال بزنید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.