2016-10-09 28 views
6

aşağıdaki programı göz önüne alındığında çalışan başka zamanlayıcı eklemek - İkinci zamanlayıcı kolu "Timer2 sözde" döngü zaten çalışıyor çünkü döngü çalıştırın ve aslazaten döngü

#include <iostream> 
#include <uv.h> 

int main() 
{ 
    uv_loop_t loop; 
    uv_loop_init(&loop); 

    std::cout << "Libuv version: " << UV_VERSION_MAJOR << "." 
       << UV_VERSION_MINOR << std::endl; 

    int r = 0; 

    uv_timer_t t1_handle; 
    r = uv_timer_init(&loop, &t1_handle); 
    uv_timer_start(&t1_handle, 
     [](uv_timer_t *t) { std::cout << "Timer1 called\n"; }, 0, 2000); 

    uv_run(&loop, UV_RUN_DEFAULT); 

    // second timer 
    uv_timer_t t2_handle; 
    r = uv_timer_init(&loop, &t2_handle); 
    uv_timer_start(&t2_handle, 
     [](uv_timer_t *t) { std::cout << "Timer2 called\n"; }, 0, 1000); 

    uv_loop_close(&loop); 
} 

baskılı asla.

.... 
uv_run(&loop, UV_RUN_DEFAULT); 

// some work 

uv_stop(&loop); 
// now add second timer 
uv_run(&loop, UV_RUN_DEFAULT); // run again 
.... 

Ama 1 döngü bir yinelenen ile çalışan başladıktan sonra bu daha sonra tekrar hatları yürütülmez, muhtemelen işe yaramadı - Ben de çalışan ve daha sonra ikinci zamanlayıcı ekledikten sonra geçici olarak döngü durdurma çalıştı zamanlayıcısı. Peki, zaten çalışan uvloop için yeni bir zamanlayıcı tutamacını nasıl eklemeliyim?

cevap

1

Yeni bir tanıtıcı kaydı yapabilmeniz için bu döngünün durdurulması gerektiği konusunda haklısınız. uv_run'dan hemen sonra uv_stop işlevini çağırarak, uv_run ilk önce geri dönmesi gerektiğinden, bu mümkün olmaz. Örneğin, bir geri çağırma kullanılarak durdurularak elde edilebilir. İşte mevcut Timer1 tutamacını kullanarak nasıl yapılabileceğine dair oldukça aptalca bir örnek. İlk çalışmada tam olarak bir kez döngüyü durdurur.

#include <iostream> 
#include <uv.h> 

int main() { 
    uv_loop_t loop; 
    uv_loop_init(&loop); 

    std::cout << "Libuv version: " << UV_VERSION_MAJOR << "." << UV_VERSION_MINOR 
      << std::endl; 

    int r = 0; 

    uv_timer_t t1_handle; 
    r = uv_timer_init(&loop, &t1_handle); 
    *(bool *)t1_handle.data = true; // need to stop the loop 
    uv_timer_start(&t1_handle, 
       [](uv_timer_t *t) { 
        std::cout << "Timer1 called\n"; 
        bool to_stop = *(bool *)t->data; 
        if (to_stop) { 
        std::cout << "Stopping loop and resetting the flag\n"; 
        uv_stop(t->loop); 
        *(bool *)t->data = false; // do not stop the loop again 
        } 
       }, 
       0, 2000); 
    uv_run(&loop, UV_RUN_DEFAULT); 
    std::cout << "After uv_run\n"; 

    // second timer 
    uv_timer_t t2_handle; 
    r = uv_timer_init(&loop, &t2_handle); 
    uv_timer_start(&t2_handle, 
       [](uv_timer_t *t) { std::cout << "Timer2 called\n"; }, 0, 
       1000); 
    std::cout << "Start loop again\n"; 
    uv_run(&loop, UV_RUN_DEFAULT); 

    uv_loop_close(&loop); 
} 

Yani çıkış

Libuv version: 1.9 
Timer1 called 
Stopping loop and resetting the flag 
After uv_run 
Start loop again 
Timer2 called 
Timer2 called 
Timer1 called 
Timer2 called 
Timer2 called 
Timer1 called 
+0

serin, yani sadece biz ilk bıraktım emin olarak geri arama fonksiyonları var içinde biz döngü işleyebilirsiniz. –