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

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

  1. #1

    ایجاد تاخیر در برنامه

    سلام
    ایا تابعی هست که بشه در برنامه تاخیر ایجاد کرد؟
    مثل تابع delay در pascal
    و چه طوری میشه ساعت و تاریخ رو از سیستم بگیریم و در گزارش گیری در دلفی از اون استفاده کنیم؟

  2. #2
    کاربر دائمی
    تاریخ عضویت
    مرداد 1382
    محل زندگی
    ragim56@yahoo.com
    پست
    101
    سلام
    چرا نباشه ؟ هست.
    ()sleep
    تو پرانتز برحسب میلی ثانیه عدد قرار بده.

  3. #3
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    آیا ممکنه که تابعی باشه که مثل sleep کار کنه ولی باعث hang up برنامه نشه ؟؟؟؟؟؟؟؟؟؟؟؟

  4. #4
    درود
    وقتی شما میخواهید توی برنامتون تاخیر ایجاد کنید یعنی به اندازه 2-3 ثانیه کاربر منتظر بمونه، خوب باید از همین دستور استفاده کنید، Sleepباعث میشه کاربر مدت زمانی منتظر بمونه و توانایی انجام کاری رو در برنامه نداشته باشه.

  5. #5
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    نه من می خوام که فقط کدی که نوشتم تاخیر کنه نه اینتر فیس برنامه !!!!!

  6. #6
    نه من می خوام که فقط کدی که نوشتم تاخیر کنه نه اینتر فیس برنامه !!!!!
    Sleep موجب متوقف شدن Thread جاری میشه، اگه اینترفیس کاربر و کد شما در Thread های متفاوتی باشند، Sleep روی رابط کاربر تاثیری نمیراره

  7. #7
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    (باز هم دم آقای کشاورز گرم)
    علی آقا بسیار از راهنمایی تون ممنونم ولی من با Thread ها مشکل دارم می شه یک مثال بزنید و Thread رو برام شرح بدین که چطوری تعریف میشه و چطوری کار میکنه ...

    ممنون میشم .

  8. #8
    کاربر دائمی آواتار MSK
    تاریخ عضویت
    تیر 1383
    محل زندگی
    فعلا تهران - بعدا خدا می‌دونه!
    پست
    331

    t := GetTickCount;
    While GetTickCount<=(T + 5000) do application.ProcessMessages;


  9. #9
    من با Thread ها مشکل دارم می شه یک مثال بزنید و Thread رو برام شرح بدین که چطوری تعریف میشه و چطوری کار میکنه ...
    می تونید از روشی که آقای MSK گفتند استفاده کنید تا مجبور به استفاده از Thread نشید.

    اما برای استفاده از Thread می تونید از توابع API ویندوز استفاده کنید یا از کلاس TThread در دلفی استفاده کنید که به نوعی عملکردهای یک Thread رو در خودش کپسوله کرده.
    برای ساختن یک Thread با استفاده از TThread می تونید از منوی فایل گزینه New |Others | Thread Object رو انتخاب کنید و یک اسم برای کلاس thread خودتون تایپ کنید تا یک کلاس از نوع TThread در یک یونیت جدید، ایجاد بشه.
    یک procedure به اسم Execute وجود داره که در هنگام اجرا شدن Thread کد داخل اون اجرا میشند. کدی که باید در داخل Thread اجرا بشه رو باید در این procedure بنویسید.
    در داخل Thread اصلی یا هر Thread دیگه، می تونید یک شی از کلاس Thread ایی که ساختید بسازید. اگر می خواید Thread بالافاصله پس از ساخته شدن اجرا بشه، باید به متد Create اون مقدار False پاس بدید، اگر فقط قصد ساختن Thread، مقدار دهی اولیه فیلدهای اون و سپس اجرای Thread رو دارید، باید به متد Create مقدار False رو پاس بدید و بعد از مقدار دهی اولیه فیلدها و متغیرها از متد Resume برای اجرای Thread استفاده کنید.
    اگر خاصیت FreeOnTerminate شی TThread را True کنید، پس از پایان اجرای متد Execute، ثرید بطور خودکار آزاد میشه.
    برای متوقف کردن موقتی یک Thread می تونید از متد Suspend استفاده کنید، برای ادامه کار Thread هم باید از متد Resume استفاده بشه.
    برای متوقف کردن یک Thread می تونید از متد Terminate استفاده کنید، البته باید دقت کنید که متد Terminate فقط مقدار فیلد Terminated را True می کنه و عملا کار خاصی برای متوقف کردن Thread نمی کنه. شما باید در داخل متد Execute مرتبا مقدار فیلد Terminated رو چک کنید و در صورتی که True بود، اجرای متد رو متوقف کنید. این امکان وجود داره که بعد از اجرای متد Terminate ثرید بالافاصله متوقف نشه، برای اطمینان از اینکه 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 ها هم استفاده کنید.
    بحث همزمان سازی، بحثی پیچیده و وقت گیر هست. توصیه می کنم خودتون در این زمینه مطالعاتی انجام بدید. یادم هست که قبلا آقای Inprise در همین سایت یک کتاب عالی در زمینه کار با Thread ها در دلفی معرفی کرده بودند: Multithreading - The Delphi Way نوشته Martin Harvey. فکر کنم مطالعه این کتاب می تونه خیلی بهتون کمک کنه.

    یک مثال ساده درباره استفاده از TThread و متد Synchronize در پیوست هست.
    فایل های ضمیمه فایل های ضمیمه

  10. #10
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    با تشکر فراوان از آقایان Msk و کشاورز ....

  11. #11
    سلام
    من تازه این تاپیک رو پیدا کردم موقع اجرای فایلی که قرار دادین میگه
    [Fatal Error] Unit2.pas(25): File not found: 'ztvregister.dcu'
    مشکل کجاست
    ممنون

  12. #12
    کاربر دائمی آواتار nasr
    تاریخ عضویت
    آذر 1382
    محل زندگی
    هر کجا هستم باشم آسمان مال من است پنجره فکر هوا عشق زمین مال من است
    پست
    2,018
    در Unit1 قسمت Uses باید بونیت های ztvregister, ztvBase, ztvZip را پاکشون کنید

  13. #13
    سلام

    اگر می خواید Thread بالافاصله پس از ساخته شدن اجرا بشه، باید به متد Create اونمقدار False پاس بدید، اگر فقط قصد ساختن Thread، مقدار دهی اولیه فیلدهای اون وسپس اجرای Thread رو دارید، باید به متد Create مقدار False رو پاس بدید و بعد ازمقدار دهی اولیه فیلدها و متغیرها از متد Resume برای اجرای Thread استفاده کنید.


    کدوم رو باید False پاس داد
    ممنون

  14. #14
    سلام
    خیلی ممنون
    مشکلم با حذف این سه رفع شده
    این 3 تا مال چه کامپوننتی؟

  15. #15
    کاربر دائمی آواتار noroozifar
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    کرمان
    پست
    446
    برای گرفتن ساعت می تونی از دستور زیر استفاده کنی مثلا
    ;(edit1.text:=time(now

    برای تاریخ فقط به جای time عبارت date بنویس و اگر می خواهی ساعت سیستم با ساعت شما یکی شود داخل یک تیمر دستور اول را تایپ کن در مورد سئوال اول اطلاع ندارم

  16. #16

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

    نقل قول نوشته شده توسط reza5 مشاهده تاپیک
    سلام
    چرا نباشه ؟ هست.
    ()sleep,
    تو پرانتز برحسب ثانیه عدد قرار بده.
    البته usleep() بر حسب میکرو ثانیه است

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

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

    • ممنون از جناب آقای کشاورز یا 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 صبح

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

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

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