Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Persian
  4. نحوه ایجاد تاخیر در برنامه
Forum Updated to NodeBB v4.3 + New Features

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

Scheduled Pinned Locked Moved Persian
13 Posts 4 Posters 6.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    devildarkness
    wrote on last edited by
    #1

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


    http://blog.DeadMan.Ir

    1 Reply Last reply
    0
    • M Offline
      M Offline
      mohsen
      wrote on last edited by
      #2

      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

      1 Reply Last reply
      0
      • D Offline
        D Offline
        devildarkness
        wrote on last edited by
        #3

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


        http://blog.DeadMan.Ir

        1 Reply Last reply
        0
        • S Offline
          S Offline
          soroush
          wrote on last edited by
          #4

          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 برای این منظور طراحی نشده!

          1 Reply Last reply
          0
          • S Offline
            S Offline
            shs_night
            wrote on last edited by
            #5

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

            QtSDK 1.2 + MinGW + Desktop !

            1 Reply Last reply
            0
            • S Offline
              S Offline
              soroush
              wrote on last edited by
              #6

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

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

              1 Reply Last reply
              0
              • M Offline
                M Offline
                mohsen
                wrote on last edited by
                #7

                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 ها میتونن منتظر پاسخ باشند.

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  soroush
                  wrote on last edited by
                  #8

                  [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 یا سمافور.

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    mohsen
                    wrote on last edited by
                    #9

                    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.

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      soroush
                      wrote on last edited by
                      #10

                      [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 نمی‌تونه از داخل خود ترد فراخوانی بشه. برنامه کرش می‌کنه.

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        mohsen
                        wrote on last edited by
                        #11

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

                        1 Reply Last reply
                        0
                        • S Offline
                          S Offline
                          soroush
                          wrote on last edited by
                          #12

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

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

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            mohsen
                            wrote on last edited by
                            #13

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

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved