基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_async_sleep.cpp 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <chrono>
  2. #include <iostream>
  3. #include <string>
  4. #include <conio.h>
  5. #include <thread>
  6. #include "librf.h"
  7. using namespace resumef;
  8. future_vt test_sleep_use_timer()
  9. {
  10. using namespace std::chrono;
  11. co_await resumef::sleep_for(100ms);
  12. std::cout << "timer after 100ms." << std::endl;
  13. if (co_await resumef::sleep_until(system_clock::now() + 200ms))
  14. std::cout << "timer canceled." << std::endl;
  15. else
  16. std::cout << "timer after 200ms." << std::endl;
  17. }
  18. void test_wait_all_events_with_signal_by_sleep()
  19. {
  20. using namespace std::chrono;
  21. event_t evts[8];
  22. go[&]() -> future_vt
  23. {
  24. if (co_await event_t::wait_all(evts))
  25. std::cout << "all event signal!" << std::endl;
  26. else
  27. std::cout << "time out!" << std::endl;
  28. };
  29. srand((int)time(nullptr));
  30. for(size_t i=0; i<_countof(evts); ++i)
  31. {
  32. go[&, i]() -> future_vt
  33. {
  34. co_await resumef::sleep_for(1ms * (500 + rand() % 1000));
  35. evts[i].signal();
  36. std::cout << "event[ " << i << " ] signal!" << std::endl;
  37. };
  38. }
  39. while (!this_scheduler()->empty())
  40. {
  41. this_scheduler()->run_one_batch();
  42. //std::cout << "press any key to continue." << std::endl;
  43. //_getch();
  44. }
  45. }
  46. void resumable_main_sleep()
  47. {
  48. go test_sleep_use_timer();
  49. this_scheduler()->run_until_notask();
  50. std::cout << std::endl;
  51. test_wait_all_events_with_signal_by_sleep();
  52. std::cout << std::endl;
  53. }