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



  • p{direction:rtl;text-align:right}. سلام
    میخوام تو برنامم بین دو دستور متوالی wait بزارم!
    چون کلاسم رو از QThread inherit نکردم نتونستم از msleep استفاده کنم.
    چه راه دیگه ای رو پیشنهاد میکنید ؟



  • p{direction:rtl; text-align:right}. میتونید از QTest استفاده کنید.
    @
    #include <QTest>
    ...
    QTest::qWait(1000);
    @

    "QTest Namespace":http://developer.qt.nokia.com/doc/qt-4.8/qtest.html



  • p{direction:rtl;text-align:right}. ممنون



  • p{direction:rtl;text-align:right}. مگه سیستم‌عامل امکانات بلاک کردن پراسس رو نداره؟ بهتره از اونا استفاده کنی. برنامه‌ت چه بخوای چه نخوای حداقل یک Thread داره! استاندارد IEEE POSIX هست. بنابراین می‌تونی از ترد ها استفاده کنی. اگه میخوای حتماً کیوتی باشه این شکلی میشه:

    @
    QThread::currentThread()->wait(1000);
    @

    p{direction:rtl;text-align:right}. البته این وقتی کار می‌کنه که از تردی خارج از ترد فعلی فراخوانی کنی. در غیر این صورت از این استفاده کن:

    @
    class Sleeper : public QThread
    {
    public:
    static void msleep(unsigned long msecs)
    {
    QThread::msleep(msecs);
    }
    };
    @

    p{direction:rtl;text-align:right}. و هرجای برنامه می‌تونی:

    @
    Sleeper::msleep(1000);
    @

    p{direction:rtl;text-align:right}. ولی توصیه نمی‌کنم! بهتره از سیستم‌عامل استفاده کنی. مثلا برای یونیکس‌ها:

    @
    #include <unistd.h>
    //...
    //....
    usleep(1000000); // برحسب میکروثانیه
    @

    .

    [quote author="Mohsen" date="1325679690"]p{direction:rtl; text-align:right}. میتونید از QTest استفاده کنید.
    @
    #include <QTest>
    ...
    QTest::qWait(1000);
    @
    [/quote]

    p{direction:rtl; text-align:right}. فضای نام QTest برای این منظور طراحی نشده!



  • p{direction:rtl; text-align:right}. اگه توی ترد اصلی برنامه این کار رو بکنیم باعث کرش برنامه نمیشه؟



  • [quote author="Mahdi" date="1328103782"]p{direction:rtl; text-align:right}. اگه توی ترد اصلی برنامه این کار رو بکنیم باعث کرش برنامه نمیشه؟[/quote]

    p{direction:rtl; text-align:right}. نه کرش نمی‌کنه! تو لینوکس کلاً کار نمی‌کنه... گفتم که فقط خارج از ترد اصلی میشه این کار رو انجام داد. تردها اجازه ندارن خودشونو wait کنن.



  • p{direction:rtl; text-align:right}. معمولا Wait کردن فقط برای تست نرم افزار استفاده میشه. در صورتی که برنامه نیاز داشته باشه تا منتظر پیغامی باشه میتونید از یک حلقه استفاده کنید که هیچ مشکلی هم در Thread نداره. اگر Wait نمایش نیاز دارید میتونید ساعت را قبل از شروع حلقه بگیرید و درون حلقه اختلافش را با ساعت فعلی بگیرید و وقتی به تعداد ثانیه مورد نظر رسید از حلقه خارج شوید.

    [quote author="soroush" date="1328256620"]

    p{direction:rtl; text-align:right}. تردها اجازه ندارن خودشونو wait کنن.
    [/quote]

    p{direction:rtl; text-align:right}. تمام برنامه هایی که از طریق سیستم عامل اجرا میشوند یک Thread هستند. Thread ها میتونن منتظر پاسخ باشند.



  • [quote author="Mohsen" date="1328297759"]
    میتونید از یک حلقه استفاده کنید
    [/quote]

    p{direction:rtl; text-align:right}. از حــــــلـــــقه برای wait کردن استفاده کنیم!!!!!!؟؟؟؟؟

    [quote author="Mohsen" date="1328297759"]
    تردها اجازه ندارن خودشونو wait کنن.
    تمام برنامه هایی که از طریق سیستم عامل اجرا میشوند یک Thread هستند. Thread ها میتونن منتظر پاسخ باشند.[/quote]

    p{direction:rtl; text-align:right}. یک ترد POSIX داخل خودش نمی‌تونه خودش رو wait کنه. یک ترد دیگه می‌تونه اون ترد رو wait کنه و یا همون ترد از systemcall های غیرمستقیم استفاده کنه. مثلا از usleep یا block یا سمافور.



  • p{direction: rtl; text-align:right}. Sleep یک Thread را بطور کامل متوقف می سازد. در صورتی که داخل Thread بخواهید منتظر پاسخ باشید میتوانید از While و QApplication::ProcessEvents استفاده کنید. ولی اصولا منطقی نیست.

    [quote author="soroush" date="1328304040"]
    p{direction:rtl; text-align:right}. یک ترد POSIX داخل خودش نمی‌تونه خودش رو wait کنه. یک ترد دیگه می‌تونه اون ترد رو wait کنه و یا همون ترد از systemcall های غیرمستقیم استفاده کنه. مثلا از usleep یا block یا سمافور.
    [/quote]

    p{direction:rtl; text-align:right}. مطمئنی؟ تا اونجا که من میدونم فرمان Sleep برای Thread از هر جایی میتونه صادر بشه حتی از خود Thread.



  • [quote author="Mohsen" date="1328335120"]p{direction: rtl; text-align:right}. Sleep یک Thread را بطور کامل متوقف می سازد. در صورتی که داخل Thread بخواهید منتظر پاسخ باشید میتوانید از While و QApplication::ProcessEvents استفاده کنید. ولی اصولا منطقی نیست.

    [quote author="soroush" date="1328304040"]
    p{direction:rtl; text-align:right}. یک ترد POSIX داخل خودش نمی‌تونه خودش رو wait کنه. یک ترد دیگه می‌تونه اون ترد رو wait کنه و یا همون ترد از systemcall های غیرمستقیم استفاده کنه. مثلا از usleep یا block یا سمافور.
    [/quote]

    p{direction:rtl; text-align:right}. مطمئنی؟ تا اونجا که من میدونم فرمان Sleep برای Thread از هر جایی میتونه صادر بشه حتی از خود Thread.[/quote]

    p{direction:rtl; text-align:right}. بله مطمئنم. هیچ تردی نمی‌تونه خودش رو wait کنه. اگر هم بخواد بکنه باید از سیستم‌عامل بخواد این کار رو براش انجام بده :-/ فرمان Sleep نمی‌تونه از داخل خود ترد فراخوانی بشه. برنامه کرش می‌کنه.



  • p{direction:rtl; text-align:right}. مگه Thread بغیر از سیستم عامل طور دیگه ای هم پیاده سازی میشه؟



  • [quote author="Mohsen" date="1328381423"]p{direction:rtl; text-align:right}. مگه Thread بغیر از سیستم عامل طور دیگه ای هم پیاده سازی میشه؟[/quote]

    p{direction:rtl; text-align:right}. مدیریت تردها در دو سطح kernel و user انجام میشه. API های مربوط به POSIX این‌طور طراحی شدن. در مورد ویندوز اطلاع دقیق ندارم اما تقریباً مطمئنم که ویندوز هم تردهای سطح کرنل و سطح کاربر داره.



  • p{direction:rtl; text-align:right}. والا تا جایی که من مطالعه و کار کردم چه User و چه Kernel بهرحال باید در صف Process Management سیستم عامل قرار بگیرند و از آنجا که برنامه ها در حالت Protected Mode اجرا می شوند اتفاقا من نظر عکس دارم. یعنی ممکن است در برخی موارد یک Process یا همان Thread فقط از طریق خودش بتونه توقف کنه مگر اینکه سیستم عامل این اجازه رو از طریقی به برنامه های دیگر بده. برای چیز هایی که گفتی Refrence خاصی داری تا مطالعه کنم؟


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.