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

نام تاپیک: ایجاد تاخیر در برنامه

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    کاربر دائمی آواتار SayeyeZohor
    تاریخ عضویت
    اسفند 1387
    محل زندگی
    ا-ص-ف-ه-ا-ن
    پست
    640

    نقل قول: ایجاد تاخیر در برنامه

    • ممنون از جناب آقای کشاورز یا ID جدید @vcldeveloper
    • یک procedure به اسم Execute وجود داره که در هنگام اجرا شدن Thread کد داخل اون اجرا میشند.
      • کدی که باید در داخل Thread اجرا بشه رو باید در این procedure بنویسید.


    • در داخل Thread اصلی یا هر Thread دیگه، می تونید یک شی از کلاس Thread ایی که ساختید بسازید.
    • اگر می خواید Thread بالافاصله پس از ساخته شدن اجرا بشه، باید به متد Create اون مقدار False پاس بدید،
    • اگر فقط قصد ساختن Thread، مقدار دهی اولیه فیلدهای اون و سپس اجرای Thread رو دارید، باید به متد Create مقدار True رو پاس بدید و بعد از مقدار دهی اولیه فیلدها و متغیرها از متد Resume یا Start برای اجرای Thread استفاده کنید.
    • اگر خاصیت FreeOnTerminate شی TThread را True کنید، پس از پایان اجرای متد Execute، ثرید (Thread) بطور خودکار آزاد میشه. وگرنه بعد از پایان کار ترد باید حافظه تخصیصی به شی ساخته شده از ترد را آزاد یا free کنید.
    • برای متوقف کردن موقتی یک Thread می تونید از متد Suspend استفاده کنید،
    • برای ادامه کار Thread هم باید از متد Resume استفاده بشه.
    • برای متوقف کردن یک Thread می تونید از متد Terminate استفاده کنید،
      • البته باید دقت کنید که متد Terminate فقط مقدار فیلد Terminated را True می کنه و عملا کار خاصی برای متوقف کردن Thread نمی کنه. شما باید در داخل متد Execute مرتباً مقدار فیلد Terminated رو چک کنید و در صورتی که True بود، اجرای متد رو متوقف کنید. این امکان وجود داره که بعد از اجرای متد Terminate ثرید (Thread) بالافاصله متوقف نشه، برای اطمینان از اینکه Thread متوقف شده، می توانید متد WaitFor رو اجرا کنید. این متد اجرای برنامه رو تا زمان متوقف شدن Thread متوقف میکنه.

    • بحث خیلی مهم درباره Thread ها، همزمان سازی هست.
      • همزمان سازی موقعی مطرح میشه که چند Thread قصد داشته باشند از یک داده بطور اشتراکی استفاده کنند.
      • برای جلوگیری از ایجاد تداخل در کار این Thread ها باید از روش های مختلفی که برای همزمان سازی وجود داره استفاده کنید (مثل Critical Section، Mutex، ُSemaphor).
      • دقت کنید که بیشتر VCL بصورت Thread Safe نوشته نشده و دسترسی همزمان Thread ها به این اشیاء ،بدون استفاده از روش های همزمان سازی، می تونه موجب مشکل در برنامه بشه - بخصوص اشیائی که از TControl مشتق شدند، در نتیجه سعی نکنید از داخل یک Thread رابط کاربر رو بصورت عادی تغییر بدید.
      • در کلاس TThread متدی به نام Synchronize وجود داره که می تونید همزمان سازی های ساده رو با اون انجام بدید، بخصوص تغییرات در رابط کاربر رو می تونید با استفاده از این متد انجام بدید.
      • البته متد Synchronize یک روش همزمان سازی واقعی نیست، در واقع Synchronize موجب Suspend شدن ثرید شما میشه و تابعی رو که بهش به عنوان پارامتر پاس میدید در context ثرید اصلی اجرا میکنه - دقیقا مثل اینکه اون تابع رو در Thread اصلی اجرا کرده باشید.

    • برای مطلع کردن سایر Thread ها از انجام یک کار یا بروز رسانی رابط کاربر، می تونید از message ها هم استفاده کنید.
    • بحث همزمان سازی، یک کتاب عالی در زمینه کار با Thread ها در دلفی Multithreading - The Delphi Way نوشته Martin Harvey.
    • هر ترد یک شناسه داره که می توانیم براپرتی ThreadID بهش دسترسی پیدا کنیم






    ExcelReaderThread := TExcelSheetNameReaderThread.Create(True);
    ExcelReaderThread.ThreadName := 'ExcelReaderThread';
    ExcelReaderThread.FileName := Edit1.Text;


    TThread.Synchronize(nil,
    procedure
    begin
    Memo2.Lines.Clear;
    Memo2.Lines.Add(IntToStr(ExcelReaderThread.ThreadI D));
    end);



    1- روش اول:

    ExcelReaderThread.Start;
    ExcelReaderThread.WaitFor;
    //-- چون بعد از WaitFor اطلاعات memo را پر می کنیم پس نیاز به synchronize نداریم و در این حالت ترد کارش تمام شده
    Memo2.Lines.AddStrings(ExcelReaderThread.SheetName s);
    Memo2.Lines.Add(IntToStr(ExcelReaderThread.ThreadI D));
    ExcelReaderThread.Free;


    2- روش دوم:

    ExcelReaderThread.FreeOnTerminate := True;
    ExcelReaderThread.OnTerminate := OnExcelReaderThreadTerminate;
    ExcelReaderThread.Start;


    PROCEDURE TFM1.OnExcelReaderThreadTerminate(Sender: TObject);
    BEGIN


    Memo2.Lines.Clear;
    Memo2.Lines.AddStrings(TExcelSheetNameReaderThread (Sender).SheetNames);


    END;



    https://barnamenevis.org/showthread....l=1#post397059
    آخرین ویرایش به وسیله SayeyeZohor : جمعه 24 شهریور 1402 در 02:28 صبح

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

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

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