基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. resumef::sleep_for(100ms); //incorrect!!!
  12. co_await resumef::sleep_for(100ms);
  13. std::cout << "timer after 100ms." << std::endl;
  14. try
  15. {
  16. co_await resumef::sleep_until(system_clock::now() + 200ms);
  17. std::cout << "timer after 200ms." << std::endl;
  18. }
  19. catch (resumef::timer_canceled_exception)
  20. {
  21. std::cout << "timer canceled." << std::endl;
  22. }
  23. }
  24. void test_wait_all_events_with_signal_by_sleep()
  25. {
  26. using namespace std::chrono;
  27. event_t evts[8];
  28. go[&]() -> future_vt
  29. {
  30. if (co_await event_t::wait_all(evts))
  31. std::cout << "all event signal!" << std::endl;
  32. else
  33. std::cout << "time out!" << std::endl;
  34. };
  35. srand((int)time(nullptr));
  36. for (size_t i = 0; i < _countof(evts); ++i)
  37. {
  38. go[&, i]() -> future_vt
  39. {
  40. co_await resumef::sleep_for(1ms * (500 + rand() % 1000));
  41. evts[i].signal();
  42. std::cout << "event[ " << i << " ] signal!" << std::endl;
  43. };
  44. }
  45. while (!this_scheduler()->empty())
  46. {
  47. this_scheduler()->run_one_batch();
  48. //std::cout << "press any key to continue." << std::endl;
  49. //_getch();
  50. }
  51. }
  52. void resumable_main_sleep()
  53. {
  54. go test_sleep_use_timer();
  55. this_scheduler()->run_until_notask();
  56. std::cout << std::endl;
  57. test_wait_all_events_with_signal_by_sleep();
  58. std::cout << std::endl;
  59. }