نقل قول: اجراي دايمي يك Thread
در هیمن ترد یا ترد جداگانه ؟
اگر در همین ترد میخواین این کار رو بکنید که کافیه یه پروسیجر بنویسید و تو OnExecute فراخوانیش کنید ، اگر منظورتون در ترد دیگری هست که به راحتی یه ترد دیگه بسازید و در onExecute کارهای مورد نظر رو انجام بدید و یا اگر قراره تردها با هم هماهنگ بشن به وسیله فرستادن پیغام به هم میتون از وضعیت هم مطلع بشن .
نقل قول: اجراي دايمي يك Thread
Threadي كه ساختم با فراخواني OnExecute كار مي كنه. مي خوام مثل يك لوپ دايما عمل انتقال داده رو انجام بده.
نقل قول: اجراي دايمي يك Thread
کدی که در رویداد OnExecute مینویسید تا زمان متوقف نشدن توسط شما ( Terminate کرد ترد یا ... ) دائما در حال اجرا هست .
1 ضمیمه
نقل قول: اجراي دايمي يك Thread
سلام.
میتونید از یک Thread Timer استفاده کنید:
نقل قول: اجراي دايمي يك Thread
نقل قول:
نوشته شده توسط
Naruto
سلام.
میتونید از یک Thread Timer استفاده کنید:
نیاز چندانی به استفاده ازش ندارن چون ایشون ترد رو پیاده کردن و کامپوننت Thread Timer هم بیشتر از این کار براشون نمیکنه ! ، همونطور که گفتم کدهای فراخوانی شده تو ترد تا زمان Terminate نشدن ترد مکررا تکرار میشن ، پس اگر مشکلی تو برنامه ایشون هست از پیاده سازی تردشون هست که باید بررسی بشه .
نقل قول: اجراي دايمي يك Thread
نقل قول:
نوشته شده توسط
مجتبی تاجیک
... همونطور که گفتم کدهای فراخوانی شده تو ترد تا زمان 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;
نقل قول: اجراي دايمي يك Thread
نقل قول:
من متوجه منظور شما نشدم، یعنی چی "مکررا تکرار میشن"؟ مکرراً چجوری و با چه فواصل زمانی تکرار میشن؟ باید لوپ تو کد باشه که تکرار بشه دیگه همینجوری که تکرار نمیشه
منظور من هم دقیقا همین بود ولی مثل اینکه بد بیانش کردم ، گفتم که تا زمان Terminate نشدن ...
نقل قول: اجراي دايمي يك Thread
مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.
شما برای اینکه برنامه تر تان در پس زمینه باشه احتیاج به استفاده از سرویس دارید میتوانید یک سرویس بسازید و داده ها را به دست سرویس بسپارید . برای ارتباط با سرویس هم از mapFile استفاده کنید.
نقل قول: اجراي دايمي يك Thread
نقل قول:
نوشته شده توسط
tdkhakpur
مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.
شما برای اینکه برنامه تر تان در پس زمینه باشه احتیاج به استفاده از سرویس دارید میتوانید یک سرویس بسازید و داده ها را به دست سرویس بسپارید . برای ارتباط با سرویس هم از mapFile استفاده کنید.
سوال رو اشتباه متوجه شدید :
نقل قول:
برنامه اي براي انتقال دايم داده بين كامپيوتر و يك برد وجود دارد. براي انجام اين كار يك Thread تعريف كردم كه با فراخواني OnExecute داده ها را انتقال مي دهد. مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.
ایشون میخواین تو خود برنامشون یه ترد مجزا برای این عملیات پیاده کنن .
نقل قول: اجراي دايمي يك Thread
نقل قول:
سوال رو اشتباه متوجه شدید
ایشون میخواین تو خود برنامشون یه ترد مجزا برای این عملیات پیاده کنن .
این یک پیشنهاد بود که دادیم عزیز!
نقل قول: اجراي دايمي يك Thread
نقل قول:
سلام
برنامه اي براي انتقال دايم داده بين كامپيوتر و يك برد وجود دارد. براي انجام اين كار يك 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 میگنجه. حالا که قالب کلی مسئله مشخص شد، شما می تونید راه حل های مختلف برای این مسئله با استفاده از اشیاء مختلف (مثل Semaphore یا monitor و غیره) را مطالعه کنید.
اگر مسئله همین Producer-consumer هست، بگید تا من درباره پیاده سازی اش با دلفی توضیح بدم. اگر چیز دیگه ایی هست، مسئله را اگر بیشتر توضیح بدید، میشه راه حل اختصاصی و کارا تری براش ارائه کرد.
موفق باشید
نقل قول: اجراي دايمي يك Thread
سلام آقاي كشاورز!
ممنون از پاسخ.. احتمالا همين روشي كه شما گفتيد جواب مي ده.. خيلي بحث پيچيده اي نيست
ممنون از پاسخهاتون