نمایش نتایج 1 تا 13 از 13

نام تاپیک: اجراي دايمي يك Thread

  1. #1

    اجراي دايمي يك Thread

    سلام
    برنامه اي براي انتقال دايم داده بين كامپيوتر و يك برد وجود دارد. براي انجام اين كار يك Thread تعريف كردم كه با فراخواني OnExecute داده ها را انتقال مي دهد. مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.
    چه كار بايد بكنم؟
    بیا ای خسته خاطر دوست ! ای مانند من دلکنده و غمگین
    من اینجا بس دلم تنگ است
    بیا ره توشه برداریم
    قدم در راه بی فرجام بگذاریم


  2. #2

    نقل قول: اجراي دايمي يك Thread

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

  3. #3

    نقل قول: اجراي دايمي يك Thread

    Threadي كه ساختم با فراخواني OnExecute كار مي كنه. مي خوام مثل يك لوپ دايما عمل انتقال داده رو انجام بده.
    بیا ای خسته خاطر دوست ! ای مانند من دلکنده و غمگین
    من اینجا بس دلم تنگ است
    بیا ره توشه برداریم
    قدم در راه بی فرجام بگذاریم


  4. #4

    نقل قول: اجراي دايمي يك Thread

    کدی که در رویداد OnExecute مینویسید تا زمان متوقف نشدن توسط شما ( Terminate کرد ترد یا ... ) دائما در حال اجرا هست .

  5. #5
    کاربر تازه وارد آواتار Naruto
    تاریخ عضویت
    شهریور 1387
    محل زندگی
    تهران
    پست
    79

    نقل قول: اجراي دايمي يك Thread

    سلام.
    میتونید از یک Thread Timer استفاده کنید:
    فایل های ضمیمه فایل های ضمیمه

  6. #6

    نقل قول: اجراي دايمي يك Thread

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

  7. #7
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    نقل قول: اجراي دايمي يك 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;

  8. #8

    نقل قول: اجراي دايمي يك Thread

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

  9. #9
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    ایران سرای من است
    پست
    2,655

    نقل قول: اجراي دايمي يك Thread

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

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

  10. #10

    نقل قول: اجراي دايمي يك Thread

    نقل قول نوشته شده توسط tdkhakpur مشاهده تاپیک
    مب خواهم اين Thread دايما در پس زمينه برنامه اجرا شود و هر بار مقادير چند آرايه و متغير را با توجه به داده ها جا به جا شده به روز رساني كنم.

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

  11. #11
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    ایران سرای من است
    پست
    2,655

    نقل قول: اجراي دايمي يك Thread

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

  12. #12

    نقل قول: اجراي دايمي يك 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 هست، بگید تا من درباره پیاده سازی اش با دلفی توضیح بدم. اگر چیز دیگه ایی هست، مسئله را اگر بیشتر توضیح بدید، میشه راه حل اختصاصی و کارا تری براش ارائه کرد.

    موفق باشید


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  13. #13

    نقل قول: اجراي دايمي يك Thread

    سلام آقاي كشاورز!
    ممنون از پاسخ.. احتمالا همين روشي كه شما گفتيد جواب مي ده.. خيلي بحث پيچيده اي نيست

    ممنون از پاسخهاتون
    بیا ای خسته خاطر دوست ! ای مانند من دلکنده و غمگین
    من اینجا بس دلم تنگ است
    بیا ره توشه برداریم
    قدم در راه بی فرجام بگذاریم


برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •