PDA

View Full Version : اجراي دايمي يك Thread



hosseinzadeh
یک شنبه 07 شهریور 1389, 19:19 عصر
سلام
برنامه اي براي انتقال دايم داده بين كامپيوتر و يك برد وجود دارد. براي انجام اين كار يك Thread تعريف كردم كه با فراخواني OnExecute داده ها را انتقال مي دهد. مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.
چه كار بايد بكنم؟

Felony
یک شنبه 07 شهریور 1389, 19:54 عصر
در هیمن ترد یا ترد جداگانه ؟
اگر در همین ترد میخواین این کار رو بکنید که کافیه یه پروسیجر بنویسید و تو OnExecute فراخوانیش کنید ، اگر منظورتون در ترد دیگری هست که به راحتی یه ترد دیگه بسازید و در onExecute کارهای مورد نظر رو انجام بدید و یا اگر قراره تردها با هم هماهنگ بشن به وسیله فرستادن پیغام به هم میتون از وضعیت هم مطلع بشن .

hosseinzadeh
یک شنبه 07 شهریور 1389, 20:43 عصر
Threadي كه ساختم با فراخواني OnExecute كار مي كنه. مي خوام مثل يك لوپ دايما عمل انتقال داده رو انجام بده.

Felony
یک شنبه 07 شهریور 1389, 22:06 عصر
کدی که در رویداد OnExecute مینویسید تا زمان متوقف نشدن توسط شما ( Terminate کرد ترد یا ... ) دائما در حال اجرا هست .

Naruto
دوشنبه 08 شهریور 1389, 04:59 صبح
سلام.
میتونید از یک Thread Timer استفاده کنید:

Felony
دوشنبه 08 شهریور 1389, 10:04 صبح
سلام.
میتونید از یک Thread Timer استفاده کنید:

نیاز چندانی به استفاده ازش ندارن چون ایشون ترد رو پیاده کردن و کامپوننت Thread Timer هم بیشتر از این کار براشون نمیکنه ! ، همونطور که گفتم کدهای فراخوانی شده تو ترد تا زمان Terminate نشدن ترد مکررا تکرار میشن ، پس اگر مشکلی تو برنامه ایشون هست از پیاده سازی تردشون هست که باید بررسی بشه .

Saeed_m_Farid
دوشنبه 08 شهریور 1389, 11:09 صبح
... همونطور که گفتم کدهای فراخوانی شده تو ترد تا زمان Terminate نشدن ترد مکررا تکرار میشن ، پس اگر مشکلی تو برنامه ایشون هست از پیاده سازی تردشون هست که باید بررسی بشه .
من متوجه منظور شما نشدم، یعنی چی "مکررا تکرار میشن"؟ مکرراً چجوری و با چه فواصل زمانی تکرار میشن؟ باید لوپ تو کد باشه که تکرار بشه دیگه همینجوری که تکرار نمیشه، مثلاً کد زیر فقط یک خط به لیست باکس اضافه میکنه :
unit TestThread;

interface

uses
SysUtils,
Classes;

type
TTestMyTh = class(TThread)
private
procedure UpdateCaption;
protected
procedure Execute; override;
end;

implementation

uses Unit1;

{ TestMyTh }


procedure TTestMyTh.UpdateCaption;
begin
Form1.ListBox1.Items.Add(FormatDateTime('yyyy/dd/mm hh:nn:ss.zzz > Row!!!', Now));
end;

procedure TTestMyTh.Execute;
begin
Synchronize(UpdateCaption);
end;

end.


برای اینکه در فواصل 0.5 ثانیه ای (مثلاً) خط جدید رو به لیست باکس اضافه کنه باید یه چیزی مثل کد زیر بنویسیم :

procedure TTestMyTh.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(UpdateCaption);
Sleep(500);
end;
end;

Felony
دوشنبه 08 شهریور 1389, 11:46 صبح
من متوجه منظور شما نشدم، یعنی چی "مکررا تکرار میشن"؟ مکرراً چجوری و با چه فواصل زمانی تکرار میشن؟ باید لوپ تو کد باشه که تکرار بشه دیگه همینجوری که تکرار نمیشه
منظور من هم دقیقا همین بود ولی مثل اینکه بد بیانش کردم ، گفتم که تا زمان Terminate نشدن ...

tdkhakpur
دوشنبه 08 شهریور 1389, 12:48 عصر
مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.

شما برای اینکه برنامه تر تان در پس زمینه باشه احتیاج به استفاده از سرویس دارید میتوانید یک سرویس بسازید و داده ها را به دست سرویس بسپارید . برای ارتباط با سرویس هم از mapFile استفاده کنید.

Felony
دوشنبه 08 شهریور 1389, 13:01 عصر
مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.

شما برای اینکه برنامه تر تان در پس زمینه باشه احتیاج به استفاده از سرویس دارید میتوانید یک سرویس بسازید و داده ها را به دست سرویس بسپارید . برای ارتباط با سرویس هم از mapFile استفاده کنید.
سوال رو اشتباه متوجه شدید :

برنامه اي براي انتقال دايم داده بين كامپيوتر و يك برد وجود دارد. براي انجام اين كار يك Thread تعريف كردم كه با فراخواني OnExecute داده ها را انتقال مي دهد. مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.

ایشون میخواین تو خود برنامشون یه ترد مجزا برای این عملیات پیاده کنن .

tdkhakpur
دوشنبه 08 شهریور 1389, 13:11 عصر
سوال رو اشتباه متوجه شدید
ایشون میخواین تو خود برنامشون یه ترد مجزا برای این عملیات پیاده کنن .

این یک پیشنهاد بود که دادیم عزیز!

vcldeveloper
دوشنبه 08 شهریور 1389, 15:19 عصر
سلام
برنامه اي براي انتقال دايم داده بين كامپيوتر و يك برد وجود دارد. براي انجام اين كار يك Thread تعريف كردم كه با فراخواني OnExecute داده ها را انتقال مي دهد. مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.
چه كار بايد بكنم؟ سلام، آقای حسین زاده عزیز! احوالی از ما نمی گیرید :چشمک:

عرضم به حضورتون، برای این کار، شما باید یک loop بی نهایت بنویسید، ولی با استفاده از توابع Wait و Synchronization object مناسب، اجرای Thread در داخل loop را متوقف کنید، تا زمانی که اون Synchronization object خاص Signal بشه. چون اگر Thread تون همینطوری بدون متوقف شدن، صرفا در یک حلقه بی نهایت اجرا بشه، CPU Cycle زیادی مصرف میکنه. یک قالب کلی می تونه به این شکل باشه:


procedure TMyThread.Execute;
var
WaitRes : Cardinal;
begin
while not Terminated do
begin
WaitRes := WaitForSingleObject(MySyncObj,INFINITE);
if WaitRes = WAIT_OBJECT_0 then
begin
// Your code comes here
end;
end;
end;حالا بحثی که پیش میاد اینه که شما از چه Synchronization Object ایی، و چه تابع Wait ایی، و به چه شکلی استفاده کنید؛ که این وابسته به نوع کاربرد شما ست.

بعضی مسائل متداول در Multi-threading وجود داره که براشون راه های بهینه هم ارائه شده. اگر مشکل شما در قالب یکی از این مسائل قرار میگیره، بهتره که راه بهینه ایی که برای آن مسئله ارائه شده، استفاده کنید. مثلا اگر بر فرض شما یک Thread دارید که باید از یک پورت خاص داده هایی را دریافت کنه، و هر زمان که داده جدیدی رسید، این داده را به یک Thread دیگه برای پردازش ارسال کنه، در این صورت، این مسئله شما در قالب Producer-consumer problem (http://en.wikipedia.org/wiki/Producer-consumer_problem) میگنجه. حالا که قالب کلی مسئله مشخص شد، شما می تونید راه حل های مختلف برای این مسئله با استفاده از اشیاء مختلف (مثل Semaphore یا monitor و غیره) را مطالعه کنید.

اگر مسئله همین Producer-consumer هست، بگید تا من درباره پیاده سازی اش با دلفی توضیح بدم. اگر چیز دیگه ایی هست، مسئله را اگر بیشتر توضیح بدید، میشه راه حل اختصاصی و کارا تری براش ارائه کرد.

موفق باشید

hosseinzadeh
سه شنبه 09 شهریور 1389, 19:58 عصر
سلام آقاي كشاورز!
ممنون از پاسخ.. احتمالا همين روشي كه شما گفتيد جواب مي ده.. خيلي بحث پيچيده اي نيست

ممنون از پاسخهاتون