1
0
miroir de https://github.com/tearshark/librf.git synchronisé 2024-10-04 08:50:31 +08:00
librf/tutorial/test_async_event_v2.cpp
2020-03-26 17:35:12 +08:00

112 lignes
2.3 KiB
C++
Brut Annotations Historique

Ce fichier contient des caractères Unicode ambigus.

Ce fichier contient des caractères Unicode qui peuvent être confondus avec d'autres caractères. Si vous pensez que c'est intentionnel, vous pouvez ignorer cet avertissement. Utilisez le bouton Échappe pour les dévoiler.

#include <chrono>
#include <iostream>
#include <string>
#include <thread>
#include "librf.h"
using namespace resumef;
using namespace std::chrono;
//非协程的逻辑线程或异步代码可以通过event_t通知到协程并且不会阻塞协程所在的线程。
static std::thread async_set_event_all(const event_v2::event_t & e, std::chrono::milliseconds dt)
{
return std::thread([=]
{
std::this_thread::sleep_for(dt);
e.signal_all();
});
}
static std::thread async_set_event_one(event_v2::event_t e, std::chrono::milliseconds dt)
{
return std::thread([=]
{
std::this_thread::sleep_for(dt);
e.signal();
});
}
static future_t<> resumable_wait_event(event_v2::event_t e, int idx)
{
if (co_await e)
std::cout << "[" << idx << "]event signal!" << std::endl;
else
std::cout << "[" << idx << "]time out!" << std::endl;
}
static future_t<> resumable_wait_timeout(event_v2::event_t e, milliseconds dt, int idx)
{
if (co_await e.wait_for(dt))
std::cout << "[" << idx << "]event signal!" << std::endl;
else
std::cout << "[" << idx << "]time out!" << std::endl;
}
static void test_notify_all()
{
event_v2::event_t evt;
go resumable_wait_event(evt, 0);
go resumable_wait_event(evt, 1);
go resumable_wait_event(evt, 2);
auto tt = async_set_event_all(evt, 100ms);
this_scheduler()->run_until_notask();
tt.join();
}
static void test_notify_one()
{
using namespace std::chrono;
{
event_v2::event_t evt;
go resumable_wait_event(evt, 10);
go resumable_wait_event(evt, 11);
go resumable_wait_event(evt, 12);
auto tt1 = async_set_event_one(evt, 100ms);
auto tt2 = async_set_event_one(evt, 500ms);
auto tt3 = async_set_event_one(evt, 800ms);
this_scheduler()->run_until_notask();
tt1.join();
tt2.join();
tt3.join();
}
}
static void test_wait_all_timeout()
{
using namespace std::chrono;
srand((int)time(nullptr));
event_v2::event_t evts[10];
std::vector<std::thread> vtt;
for(size_t i = 0; i < _countof(evts); ++i)
{
go resumable_wait_timeout(evts[i], 100ms, (int)i);
vtt.emplace_back(async_set_event_one(evts[i], 1ms * (50 + i * 10)));
}
this_scheduler()->run_until_notask();
for (auto& tt : vtt)
tt.join();
}
void resumable_main_event_v2()
{
test_notify_all();
std::cout << std::endl;
test_notify_one();
std::cout << std::endl;
test_wait_all_timeout();
std::cout << std::endl;
}