Бағдарламаны жаңа тақырыпта іске қосу үшін циклды пайдалану - ұйқы пайдаланбаңыз ба?

Міне, мен мұны өзімнің жіпте жасайтын бағдарлама бар:

public void run(){
    long lastTime = System.nanoTime();
    float lastSleep = 0;
    //Everything is in seconds.
    while(running){
        float delta = (System.nanoTime()-lastTime)/1000000000f;
        lastTime = System.nanoTime();
        manager.update(delta);
        panel.repaint();
        lastSleep = Math.max(maxTicSpeed-(delta-lastSleep),5/1000f);
        try{
            Thread.sleep((long) Math.round(lastSleep*1000));
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

Негізінде менде әрдайым ұйықтауға үйрететінмін, сондықтан да, менің бағдарламам кем дегенде 5 миллисекундқа ұйқырады, немесе шектеуден өтпей-ақ көп ұйықтауға болады (секундтың 1/30). Бірақ мен оқыдым, ұйқым өте жақсы сияқты емес.

http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx

Оның айтқан сөзінен менің бағдарлама төменгі ұйқы шегіне жақын болған жағдайда ұйықтамайды. Уақыт өзгерген кезде system.printing өзгергенде, шамамен өзгереді .31508 - .03475, бұл мен үшін өте жақсы, себебі менің бағдарлама дұрыс емес.

Мұның орнына, мен не істей аламын? Мен {Sleep} әрекетінің орнына бір нәрсе қосу туралы ойладым:

long waitTill = (long) (System.nanoTime()+lastTime/1000000000f), 
    now = System.nanoTime();
while(now < waitTill){
    now = System.nanoTime();
}

Бірақ менің ағыным процессорлық уақытты бірдей мөлшерде ұстай ма? Менің пікірімше, процессорды көп қажет етпей, тоқтауы керек еді.

Сонымен, ұйқымды қолданған жөн бе (неғұрлым аз ұйқы уақыты?), Баламалы пайдаланған жөн бе, егер мен басқа баламаны пайдалансам не болмаса менің бағдарламамның айналымсыз жылдамдықпен өтуіне рұқсат етілу керек пе? Ұйқыдағы дәлсіздікті есепке алсам да, нашар программалаудамын ба?

Көмектесуге рақмет!

EDIT: So, Timers have been recommened, however I understand that if my task didn't finish before the Timer called again then I would run into issues. That is a definate concern with my program. I feel like I have dealt with the problem of Thread.sleep() by using a delta, so, would Thread.sleep() as before be better?

2
Өзіңіздің түзетуіңіз туралы әңгімелесу үшін жауапымды жаңарттым. Мен әлі күнге дейін жоспарланған-тапсырма тәсілі Run/While/Sleep ұйығы үшін неғұрлым сенімді шешім болып табылатынын айтадым.
қосылды автор Alan, көзі
Өзіңіздің түзетуіңіз туралы әңгімелесу үшін жауапымды жаңарттым. Мен әлі күнге дейін жоспарланған-тапсырма тәсілі Run/While/Sleep ұйығы үшін неғұрлым сенімді шешім болып табылатынын айтадым.
қосылды автор Alan, көзі
Өзіңіздің түзетуіңіз туралы әңгімелесу үшін жауапымды жаңарттым. Мен әлі күнге дейін жоспарланған-тапсырма тәсілі Run/While/Sleep ұйығы үшін неғұрлым сенімді шешім болып табылатынын айтадым.
қосылды автор Alan, көзі
Петірдің мақаласының атын елемеңіз - бұл жай ғана дұрыс емес. Ұйқы (), әрине, дұрыс пайдаланылмайды және жиі болады, бірақ бұл дұрыс емес немесе қандай да бір қарсы протектор болып табылмайды.
қосылды автор Martin James, көзі
Петірдің мақаласының атын елемеңіз - бұл жай ғана дұрыс емес. Ұйқы (), әрине, дұрыс пайдаланылмайды және жиі болады, бірақ бұл дұрыс емес немесе қандай да бір қарсы протектор болып табылмайды.
қосылды автор Martin James, көзі
Мен қалқымалы заттарды қолданбаймын, бірақ бұл жағдайда флоттың дұрыс еместігі сіздің бағдарламаңызды бұзуы мүмкін. (ондық үтірден кейін float-нда шамамен 6 дәлдік ондық орын бар)
қосылды автор mmirwaldt, көзі
Thread.sleep күтуге қарағанда әлдеқайда жақсы!
қосылды автор mmirwaldt, көзі
Thread.sleep күтуге қарағанда әлдеқайда жақсы!
қосылды автор mmirwaldt, көзі
Thread.sleep күтуге қарағанда әлдеқайда жақсы!
қосылды автор mmirwaldt, көзі

8 жауаптар

Бұл мәселені шешу үшін сіз өзіңіздің дизайныңызды қайта ойластырыңыз. Іс жүзінде сіз жасай отырып, жүйелі түрде жоспарланған уақыт аралығында жұмыс жасайсыз. Run/While/Sleep ұйқылы жұмыс істейді, бірақ сіздің зерттеулеріңіз ашылған кезде оңтайлы шешім емес.

Қазіргі тілдерде «тапсырма беретін» үлгі бар, ол бағдарламалау ортасына/ОЖ-ға міндеттеріңізді орындауды жақсартуға мүмкіндік береді.

Java-де java.util.timer </< java.util.timertask бірге a>. Тапсырманы орындау үлгісімен тапсырманы жасайсыз және оны белгілі бір аралықта іске қосуды жоспарлайсыз.

Таймерлер сондай-ақ, сіз логикалық жалаушаны орнатудың орнына, таймерді болдырмау арқылы орындалатын циклды тоқтатудың таза жолын береді.

Түсініктемелер:

Ерлі-зайыптылар туралы білу керек. Егер тапсырма жоспарланған аралықтан ұзағырақ жұмыс істейтін болса, бұрынғы тапсырма әлі орындалуда басқа тапсырманы орындау мүмкіндігі бар. Бірнеше шешім:

  1. Жұмысты аяқтау үшін кезек кезегін пайдаланыңыз. Кезекте жұмыс болмаса, тапсырма қайтарылады.
  2. JavaScript-тің ортақ тәсілі - бір уақытта орындау тапсырмасын жоспарлау және тапсырманы аяқтау кезінде бір рет орындау үшін осы тапсырманы қайта жоспарлау.
  3. Белгілі бір тапсырманы көрсету үшін жалаушаны пайдаланып, аз талғамайтын тәсіл орындалады. Бұл жұмыс істейді, бірақ қатеге ұшырайтын жалауша күйін дұрыс басқаруды талап етеді.

Тағы бір жалпы проблема - жоспарланған таймерлер жиі ең күш-қуат ретінде іске асырылады. Яғни, OS/Framework тапсырманы жоспарланғандай іске қосуға тырысады, бірақ тапсырма берілген аралықта нақты орындалатын кепілдік беруші ұсынады. Сондықтан сіздің тапсырмаңыз қатты, детерминистикалық жоспарлауды қажет етсе, сізге жақын-ос/аппараттық шешім қажет болуы мүмкін.

5
қосылды
@ csga5000: Келісілді. Айту керек нәрсе бар, егер ол бұзылмаса, түзетпеңіз. Ол, тапсырманы шешуге негізделген шешімді пайдалана отырып, таратылған модельге ықтимал ауқымды түрде мүмкіндік береді.
қосылды автор Alan, көзі
@mmirwaldt: Жақсы нүкте. Мен бұл мәселе туралы әңгімелесуге жауапты жаңарттым, сондай-ақ, таймерлер міндетті түрде детерминистик болып табылмайды.
қосылды автор Alan, көзі
@ Осыған рахмет. Сіз маған функционалдық балама ұсындым (маған # 2 ұнайды), дегенмен, менің осы әдіске менің Thread.sleep() әдісін қолданып,
қосылды автор csga5000, көзі
Сіздің түсінігіңізге рахмет Алан. Мен ешқашан Таймерді жақсы көрмедім. Мен сізді жауап ретінде белгілеймін, бірақ, әлдебір мәселе сияқты, mmirwaldt айтылғандай, мен көп уақытты алатын тапсырманы орындау мүмкіндігін болжап отырмын және менің бағдарлама мыңдаған «Үлгілерді» өңдей алады және Уақытты ұзағырақ уақытқа созу, сөзсіз, алаңдаушылық тудырады. Қазірде менде бар нәрсе, бұл мәселе емес. Бұл мәселені қалай шешуге болады?
қосылды автор csga5000, көзі
System.sleep() жүйесінің дәлсіздігімен айналысатын сияқты сезінемін, System.sleep() маған әсіресе жақсы опцияны ұсынады
қосылды автор csga5000, көзі
Мәселе бірдей деректерге қол жеткізе отырып, сол уақытта және сол уақытта жұмыс істейтін көптеген ағындармен бола ма? немесе басқа нәрсе бола ма?
қосылды автор csga5000, көзі
@ csga5000: Мен сіздердің сұрақтарыңызға жауапты бағдарламамен бірге жауап бердім.
қосылды автор mmirwaldt, көзі
Тапсырмаңыздың аралықта аяқталғанына көз жеткізіңіз (көптеген адамдар жиі еске түсіреді). Әйтпесе, елеулі проблемалар туындайды және айнымалы аралықтар үшін орнына Thread.sleep функциясын пайдалану керек.
қосылды автор mmirwaldt, көзі

Бұл мәселені шешу үшін сіз өзіңіздің дизайныңызды қайта ойластырыңыз. Іс жүзінде сіз жасай отырып, жүйелі түрде жоспарланған уақыт аралығында жұмыс жасайсыз. Run/While/Sleep ұйқылы жұмыс істейді, бірақ сіздің зерттеулеріңіз ашылған кезде оңтайлы шешім емес.

Қазіргі тілдерде «тапсырма беретін» үлгі бар, ол бағдарламалау ортасына/ОЖ-ға міндеттеріңізді орындауды жақсартуға мүмкіндік береді.

Java-де java.util.timer </< java.util.timertask бірге a>. Тапсырманы орындау үлгісімен тапсырманы жасайсыз және оны белгілі бір аралықта іске қосуды жоспарлайсыз.

Таймерлер сондай-ақ, сіз логикалық жалаушаны орнатудың орнына, таймерді болдырмау арқылы орындалатын циклды тоқтатудың таза жолын береді.

Түсініктемелер:

Ерлі-зайыптылар туралы білу керек. Егер тапсырма жоспарланған аралықтан ұзағырақ жұмыс істейтін болса, бұрынғы тапсырма әлі орындалуда басқа тапсырманы орындау мүмкіндігі бар. Бірнеше шешім:

  1. Жұмысты аяқтау үшін кезек кезегін пайдаланыңыз. Кезекте жұмыс болмаса, тапсырма қайтарылады.
  2. JavaScript-тің ортақ тәсілі - бір уақытта орындау тапсырмасын жоспарлау және тапсырманы аяқтау кезінде бір рет орындау үшін осы тапсырманы қайта жоспарлау.
  3. Белгілі бір тапсырманы көрсету үшін жалаушаны пайдаланып, аз талғамайтын тәсіл орындалады. Бұл жұмыс істейді, бірақ қатеге ұшырайтын жалауша күйін дұрыс басқаруды талап етеді.

Тағы бір жалпы проблема - жоспарланған таймерлер жиі ең күш-қуат ретінде іске асырылады. Яғни, OS/Framework тапсырманы жоспарланғандай іске қосуға тырысады, бірақ тапсырма берілген аралықта нақты орындалатын кепілдік беруші ұсынады. Сондықтан сіздің тапсырмаңыз қатты, детерминистикалық жоспарлауды қажет етсе, сізге жақын-ос/аппараттық шешім қажет болуы мүмкін.

5
қосылды
@ csga5000: Келісілді. Айту керек нәрсе бар, егер ол бұзылмаса, түзетпеңіз. Ол, тапсырманы шешуге негізделген шешімді пайдалана отырып, таратылған модельге ықтимал ауқымды түрде мүмкіндік береді.
қосылды автор Alan, көзі
@mmirwaldt: Жақсы нүкте. Мен бұл мәселе туралы әңгімелесуге жауапты жаңарттым, сондай-ақ, таймерлер міндетті түрде детерминистик болып табылмайды.
қосылды автор Alan, көзі
Сіздің түсінігіңізге рахмет Алан. Мен ешқашан Таймерді жақсы көрмедім. Мен сізді жауап ретінде белгілеймін, бірақ, әлдебір мәселе сияқты, mmirwaldt айтылғандай, мен көп уақытты алатын тапсырманы орындау мүмкіндігін болжап отырмын және менің бағдарлама мыңдаған «Үлгілерді» өңдей алады және Уақытты ұзағырақ уақытқа созу, сөзсіз, алаңдаушылық тудырады. Қазірде менде бар нәрсе, бұл мәселе емес. Бұл мәселені қалай шешуге болады?
қосылды автор csga5000, көзі
@ Осыған рахмет. Сіз маған функционалдық балама ұсындым (маған # 2 ұнайды), дегенмен, менің осы әдіске менің Thread.sleep() әдісін қолданып,
қосылды автор csga5000, көзі
System.sleep() жүйесінің дәлсіздігімен айналысатын сияқты сезінемін, System.sleep() маған әсіресе жақсы опцияны ұсынады
қосылды автор csga5000, көзі
Мәселе бірдей деректерге қол жеткізе отырып, сол уақытта және сол уақытта жұмыс істейтін көптеген ағындармен бола ма? немесе басқа нәрсе бола ма?
қосылды автор csga5000, көзі
@ csga5000: Мен сіздердің сұрақтарыңызға жауапты бағдарламамен бірге жауап бердім.
қосылды автор mmirwaldt, көзі
Тапсырмаңыздың аралықта аяқталғанына көз жеткізіңіз (көптеген адамдар жиі еске түсіреді). Әйтпесе, елеулі проблемалар туындайды және айнымалы аралықтар үшін орнына Thread.sleep функциясын пайдалану керек.
қосылды автор mmirwaldt, көзі

Бұл мәселені шешу үшін сіз өзіңіздің дизайныңызды қайта ойластырыңыз. Іс жүзінде сіз жасай отырып, жүйелі түрде жоспарланған уақыт аралығында жұмыс жасайсыз. Run/While/Sleep ұйқылы жұмыс істейді, бірақ сіздің зерттеулеріңіз ашылған кезде оңтайлы шешім емес.

Қазіргі тілдерде «тапсырма беретін» үлгі бар, ол бағдарламалау ортасына/ОЖ-ға міндеттеріңізді орындауды жақсартуға мүмкіндік береді.

Java-де java.util.timer </< java.util.timertask бірге a>. Тапсырманы орындау үлгісімен тапсырманы жасайсыз және оны белгілі бір аралықта іске қосуды жоспарлайсыз.

Таймерлер сондай-ақ, сіз логикалық жалаушаны орнатудың орнына, таймерді болдырмау арқылы орындалатын циклды тоқтатудың таза жолын береді.

Түсініктемелер:

Ерлі-зайыптылар туралы білу керек. Егер тапсырма жоспарланған аралықтан ұзағырақ жұмыс істейтін болса, бұрынғы тапсырма әлі орындалуда басқа тапсырманы орындау мүмкіндігі бар. Бірнеше шешім:

  1. Жұмысты аяқтау үшін кезек кезегін пайдаланыңыз. Кезекте жұмыс болмаса, тапсырма қайтарылады.
  2. JavaScript-тің ортақ тәсілі - бір уақытта орындау тапсырмасын жоспарлау және тапсырманы аяқтау кезінде бір рет орындау үшін осы тапсырманы қайта жоспарлау.
  3. Белгілі бір тапсырманы көрсету үшін жалаушаны пайдаланып, аз талғамайтын тәсіл орындалады. Бұл жұмыс істейді, бірақ қатеге ұшырайтын жалауша күйін дұрыс басқаруды талап етеді.

Тағы бір жалпы проблема - жоспарланған таймерлер жиі ең күш-қуат ретінде іске асырылады. Яғни, OS/Framework тапсырманы жоспарланғандай іске қосуға тырысады, бірақ тапсырма берілген аралықта нақты орындалатын кепілдік беруші ұсынады. Сондықтан сіздің тапсырмаңыз қатты, детерминистикалық жоспарлауды қажет етсе, сізге жақын-ос/аппараттық шешім қажет болуы мүмкін.

5
қосылды
@ csga5000: Келісілді. Айту керек нәрсе бар, егер ол бұзылмаса, түзетпеңіз. Ол, тапсырманы шешуге негізделген шешімді пайдалана отырып, таратылған модельге ықтимал ауқымды түрде мүмкіндік береді.
қосылды автор Alan, көзі
@mmirwaldt: Жақсы нүкте. Мен бұл мәселе туралы әңгімелесуге жауапты жаңарттым, сондай-ақ, таймерлер міндетті түрде детерминистик болып табылмайды.
қосылды автор Alan, көзі
@ Осыған рахмет. Сіз маған функционалдық балама ұсындым (маған # 2 ұнайды), дегенмен, менің осы әдіске менің Thread.sleep() әдісін қолданып,
қосылды автор csga5000, көзі
System.sleep() жүйесінің дәлсіздігімен айналысатын сияқты сезінемін, System.sleep() маған әсіресе жақсы опцияны ұсынады
қосылды автор csga5000, көзі
Мәселе бірдей деректерге қол жеткізе отырып, сол уақытта және сол уақытта жұмыс істейтін көптеген ағындармен бола ма? немесе басқа нәрсе бола ма?
қосылды автор csga5000, көзі
Сіздің түсінігіңізге рахмет Алан. Мен ешқашан Таймерді жақсы көрмедім. Мен сізді жауап ретінде белгілеймін, бірақ, әлдебір мәселе сияқты, mmirwaldt айтылғандай, мен көп уақытты алатын тапсырманы орындау мүмкіндігін болжап отырмын және менің бағдарлама мыңдаған «Үлгілерді» өңдей алады және Уақытты ұзағырақ уақытқа созу, сөзсіз, алаңдаушылық тудырады. Қазірде менде бар нәрсе, бұл мәселе емес. Бұл мәселені қалай шешуге болады?
қосылды автор csga5000, көзі
@ csga5000: Мен сіздердің сұрақтарыңызға жауапты бағдарламамен бірге жауап бердім.
қосылды автор mmirwaldt, көзі
Тапсырмаңыздың аралықта аяқталғанына көз жеткізіңіз (көптеген адамдар жиі еске түсіреді). Әйтпесе, елеулі проблемалар туындайды және айнымалы аралықтар үшін орнына Thread.sleep функциясын пайдалану керек.
қосылды автор mmirwaldt, көзі

жұмсақ айналдырудан (сіздің екінші мысалыңыздан) синхрондау примитивтері сияқты кейбір жағдайларды қоспағанда, CPU тұтынатын күтуден басқа ештеңе жоқ және dead-locks -ке оңай әкелуі мүмкін!

Сондықтан, сіз аз уақыт ішінде CPU-ны пайдалану үшін ұйқы -мен жиі кешігуді пайдаланасыз және басқа да ағындарға жұмыс істеуге мүмкіндік береді, бұл өлі құлыптардың қауіп-қатерін азайтады.

Сондықтан, сіз не істеп жатқаныңызды білетін болсаңыз, бірінші циклыңызда ештеңе дұрыс емес.

Бірақ сіз осындай пайдалану жағдайларына арналған компоненттерді таңдауыңыз керек: таймерлер .

1
қосылды

Ұйқының орнына (), күту() және ескертуді қолдану жақсы ().

Ұйқы() функциясын қолданғанда, кезекке шыққан кезек шықпайды және оюды қайтадан іске қосу үшін, ОЖ қосымша жұмыс атқарады, ол таза үстеме.

Бірақ ағыны күтіп тұрған кезде, ол кезекке шықпайды және ешқандай үстеме болмайды.

0
қосылды

Алан мен Прагматик екеуі де айтқандай, Таймерлер әдетте Thread.sleep() функциясын қолдану арқылы артықшылық береді, алайда, Мартин Джеймс: «Ұйықтау() ұйқысы дұрыс пайдаланылмауы мүмкін және жиі болады, бірақ бұл шын мәнінде дұрыс емес немесе анти-паттерн «.

Менің пікірімше, Delta-ды қолданғандықтан, мен Thread.sleep() -тың дәлсіздігімен айналысамын. Айтуынша, оны қолдануда ешқандай проблема жоқ. Таймерді іске асыру біршама қиынырақ болар еді, себебі менің тапсырмам қайтадан қоңырау шалмас бұрын аяқтау керек болатын.

Осылайша, осы қосымшада және мен оны қолданған әдісінде Thread.sleep() - бұл өте қолайлы нұсқасы.

0
қосылды
Таймерлер, әрине, олардың қолданылуына ие, бірақ тым жиі уақытша күтуге қойылатын барлық талаптардың «бір өлшемі» сәйкес келеді. Таймерлерге сәйкес келмейтін тесіктерге мәжбүрлеу көбінесе әзірлеушілерге қажетсіз ауруды туғызады, таймер бойынша тапсырманы аяқтау үшін синхронды күту, кодты қарапайым ұйқы() қоңырауын пайдаланудың орнына мемлекеттік машиналар ретінде қайтадан жазу.
қосылды автор Martin James, көзі

Алан мен Прагматик екеуі де айтқандай, Таймерлер әдетте Thread.sleep() функциясын қолдану арқылы артықшылық береді, алайда, Мартин Джеймс: «Ұйықтау() ұйқысы дұрыс пайдаланылмауы мүмкін және жиі болады, бірақ бұл шын мәнінде дұрыс емес немесе анти-паттерн «.

Менің пікірімше, Delta-ды қолданғандықтан, мен Thread.sleep() -тың дәлсіздігімен айналысамын. Айтуынша, оны қолдануда ешқандай проблема жоқ. Таймерді іске асыру біршама қиынырақ болар еді, себебі менің тапсырмам қайтадан қоңырау шалмас бұрын аяқтау керек болатын.

Осылайша, осы қосымшада және мен оны қолданған әдісінде Thread.sleep() - бұл өте қолайлы нұсқасы.

0
қосылды
Таймерлер, әрине, олардың қолданылуына ие, бірақ тым жиі уақытша күтуге қойылатын барлық талаптардың «бір өлшемі» сәйкес келеді. Таймерлерге сәйкес келмейтін тесіктерге мәжбүрлеу көбінесе әзірлеушілерге қажетсіз ауруды туғызады, таймер бойынша тапсырманы аяқтау үшін синхронды күту, кодты қарапайым ұйқы() қоңырауын пайдаланудың орнына мемлекеттік машиналар ретінде қайтадан жазу.
қосылды автор Martin James, көзі

Сұрақ көтерілген кезде, таймердің тапсырмалары интервалдан ұзағырақ болса, таймер қалай әрекет етеді.

Мен таймердің өзін қалай әрекет ететінін көру үшін қисынсыз үлгі бағдарламаларын бағдарламалаған едім:

public class FlawedTimerTask extends TimerTask {
    final int taskId;
    final long sleepTime;
    int counter = 0;

    public FlawedTimerTask(int taskId, long sleepTime) {
        super();
        this.taskId = taskId;
        this.sleepTime = sleepTime;
    }

    @Override
    public void run() {
        long beginTimeInNs = System.nanoTime();
        System.out.println("taskId=" + taskId + ", run=" + counter + ", beginning at " + (beginTimeInNs-beginOfExperiment));
        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long endTimeInNs = System.nanoTime();
        System.out.println("taskId=" + taskId + ", run=" + counter + ", ending at " + (endTimeInNs-beginOfExperiment));
        counter++;
    }

    static long beginOfExperiment;

    public static void main(String[] args) {
        beginOfExperiment = System.nanoTime();
        Timer timer = new Timer();
        timer.schedule(new FlawedTimerTask(1, 800), 500, 500);
        timer.schedule(new FlawedTimerTask(2, 1000), 500, 2500);
    }
}

Шығару:

taskId=1, run=0, beginning at 491988762
taskId=1, run=0, ending at 1291944877
taskId=2, run=0, beginning at 1292056514
taskId=2, run=0, ending at 2293928680
taskId=1, run=1, beginning at 2294036467
taskId=1, run=1, ending at 3094967160
taskId=1, run=2, beginning at 3095097404
taskId=1, run=2, ending at 3894902745
taskId=1, run=3, beginning at 3895045820
taskId=1, run=3, ending at 4695902088
taskId=2, run=1, beginning at 4696095849
taskId=2, run=1, ending at 5695887973
taskId=1, run=4, beginning at 5695991911
taskId=1, run=4, ending at 6496896941
taskId=1, run=5, beginning at 6497002803
taskId=1, run=5, ending at 7297814161
taskId=1, run=6, beginning at 7297998297
taskId=1, run=6, ending at 8098803239
taskId=2, run=2, beginning at 8098922575
taskId=2, run=2, ending at 9098814787
taskId=1, run=7, beginning at 9098971977
taskId=1, run=7, ending at 9899803866
taskId=1, run=8, beginning at 9899970038
taskId=1, run=8, ending at 10699807458
taskId=1, run=9, beginning at 10699912038
taskId=1, run=9, ending at 11500693882
taskId=2, run=3, beginning at 11500815143
taskId=2, run=3, ending at 12501656270
taskId=1, run=10, beginning at 12501781380
taskId=1, run=10, ending at 13302714640
taskId=1, run=11, beginning at 13302888511
taskId=1, run=11, ending at 14102727215
taskId=1, run=12, beginning at 14102929958
taskId=1, run=12, ending at 14903695762
taskId=2, run=4, beginning at 14903878616
taskId=2, run=4, ending at 15903607223
taskId=1, run=13, beginning at 15903775961
taskId=1, run=13, ending at 16705705613
taskId=1, run=14, beginning at 16705798644
taskId=1, run=14, ending at 17505650180
taskId=1, run=15, beginning at 17505881795
taskId=1, run=15, ending at 18306578307
taskId=2, run=5, beginning at 18306718815
taskId=2, run=5, ending at 19306666847
taskId=1, run=16, beginning at 19306757953
taskId=1, run=16, ending at 20107480129
taskId=1, run=17, beginning at 20107580217
taskId=1, run=17, ending at 20907534407
taskId=1, run=18, beginning at 20907640911
taskId=1, run=18, ending at 21709616117
taskId=2, run=6, beginning at 21709784855
taskId=2, run=6, ending at 22709563506
taskId=1, run=19, beginning at 22709664236
taskId=1, run=19, ending at 23510559642
taskId=1, run=20, beginning at 23510653956
taskId=1, run=20, ending at 24310465713
taskId=1, run=21, beginning at 24310572217
taskId=1, run=21, ending at 25111451583
taskId=2, run=7, beginning at 25111549105
taskId=2, run=7, ending at 26111453508
taskId=1, run=22, beginning at 26111544614
taskId=1, run=22, ending at 26913489022
taskId=1, run=23, beginning at 26913629531
taskId=1, run=23, ending at 27713421398
taskId=1, run=24, beginning at 27713577305
taskId=1, run=24, ending at 28514443839
taskId=2, run=8, beginning at 28514550985
taskId=2, run=8, ending at 29514349525
taskId=1, run=25, beginning at 29514496450
taskId=1, run=25, ending at 30315367475
taskId=1, run=26, beginning at 30315469488
taskId=1, run=26, ending at 31115349896
taskId=1, run=27, beginning at 31115475648
taskId=1, run=27, ending at 31917465609
taskId=2, run=9, beginning at 31917563773
taskId=2, run=9, ending at 32917368087
taskId=1, run=28, beginning at 32917524636
taskId=1, run=28, ending at 33718337276
taskId=1, run=29, beginning at 33718481634
taskId=1, run=29, ending at 34518366533
taskId=1, run=30, beginning at 34518459564
taskId=1, run=30, ending at 35319336363
taskId=2, run=10, beginning at 35319516009
taskId=2, run=10, ending at 36319338930
taskId=1, run=31, beginning at 36319440301
taskId=1, run=31, ending at 37121299378
taskId=1, run=32, beginning at 37121403957
taskId=1, run=32, ending at 37921223413
taskId=1, run=33, beginning at 37921324785
taskId=1, run=33, ending at 38722168863
taskId=2, run=11, beginning at 38722270877
taskId=2, run=11, ending at 39722259328

Мұны байқауға болады

  • таймер таймер міндеттерінің интервалдарында (800 мс, 1000 мс) жұмыс істейді және 500 миллиметрінде емес
  • Таймер тапсырмалары арасында ешқандай араласу болмайды (Таймерді жалғыз ағымдық іске қосу кезінде негізгі циклде блоктаушы қоңырау бар)
0
қосылды