C++의 Coroutine을 사용했어요.
상상과는 다르다.
아까 웹사이트처럼 C++는 탄막풍의 약간 붉은 색처럼 편리한 것을 실시하는 것이 아니라 그것을 실현하기 위한 것이다.미니 레드를 직접 만드는 기분이라는 것이다.그리고 탄막풍이 주요 라인으로 돌아오는 것과 달리 탄막풍은 소환원으로 돌아왔다.
벽에 부딪쳤다
그래도 이 코로틴은새로운 것일지도 몰라요. 일본어 문헌이 하나도 없어요.내가 아는 바에 의하면 일본어에는 단지 두 개의 견본만 있다.1
하지만 쉽게 이해할 수 있어서 정말 큰 도움이 됐어요.
만들어진 물건
이 문자는 한 글자씩 그려집니다.DX 라이브러리.
코드
생성기는 상술한 사이트와 거의 같다.하지만 이번에는 보답이 필요 없어서 일단 버렸어요.어떻게 좀 해볼게요.
먼저 움직였기 때문에 여분의 일도 있으니 적당하다.
task.h#include <experimental/coroutine>
#define YIELD (co_yield NULL) /*とりあえずNULL返してる。どうにかしたい*/
struct task {
bool flag = true;
struct promise_type {
auto get_return_object() { return task{ handle_type::from_promise(*this) }; }
std::experimental::suspend_never initial_suspend()noexcept { return {}; }
std::experimental::suspend_always final_suspend()noexcept { return {}; }
std::experimental::suspend_always yield_value(void*)noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
using handle_type = std::experimental::coroutine_handle<promise_type>;
explicit task(handle_type h)
: coro_(h) {}
task(const task&) = delete;
task(task&& rhs)
: coro_(rhs.coro_) { rhs.coro_ = nullptr; }
~task() {
if (coro_)
coro_.destroy();
}
void processing() {
coro_.promise();
}
void update() {
if (!flag) return;
coro_.resume();
flag = !coro_.done();
processing();
}
handle_type coro_;
};
변경점으로 추가bool flag
가량.이렇게 하면 종료 후 작업이 호출되지 않습니다.다만, 이번 상황은 필요 없다.나는 그래도 private
를 선택하는 것이 비교적 좋다고 생각한다.
print.cpp/*省略*/
task print(std::string str) {
std::string b;
while (1) {
if (b != str) {
for (auto c : str) {
b.push_back(c);
DrawString(0, 0, b.c_str(), 0x000000);
YIELD;
}
}
else {
DrawString(0, 0, b.c_str(), 0x000000);
YIELD;
}
}
co_return;
}
main.cpp/*インクルードとか省略*/
int WINAPI WinMain(/*引数いっぱい*/) {
/*省略*/
auto DrawString = print("TestString", font);
while(/*メインループの処理とか*/){
DrawString.update();
}
/*省略*/
}
사용 방법으로 반환값task
의 함수를 사용하여 중단된 곳에 쓴다YIELD
.나는 기본적인 무한순환에 깊이 들어가면 된다고 생각한다.나는 마지막에 co_return
쓰는 것이 비교적 좋다고 생각한다.이렇게 하면 프레임마다 문자를 하나씩 그린다.
최후
조금만 더 드세요.아직 이루지 못한 것도 있지만.MSVC는 실험용으로도 사용할 수 있습니다!움직였으니까!
그리고 일본어 추가!사실대로 말하면, 온통 알 수 없는 일들뿐이다.
라이선스
라이센스는 CC0입니다.자유롭게 사용하고 변경할 수 있습니다.
참고 자료 C++ 아로마틴 확장 바
C++ 코르크
20분 정도면 C++20 연골소가 느껴져요.
참조의 위 두 개. ↩
Reference
이 문제에 관하여(C++의 Coroutine을 사용했어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/legohasiri/items/e0870b695c5079f76156
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <experimental/coroutine>
#define YIELD (co_yield NULL) /*とりあえずNULL返してる。どうにかしたい*/
struct task {
bool flag = true;
struct promise_type {
auto get_return_object() { return task{ handle_type::from_promise(*this) }; }
std::experimental::suspend_never initial_suspend()noexcept { return {}; }
std::experimental::suspend_always final_suspend()noexcept { return {}; }
std::experimental::suspend_always yield_value(void*)noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
using handle_type = std::experimental::coroutine_handle<promise_type>;
explicit task(handle_type h)
: coro_(h) {}
task(const task&) = delete;
task(task&& rhs)
: coro_(rhs.coro_) { rhs.coro_ = nullptr; }
~task() {
if (coro_)
coro_.destroy();
}
void processing() {
coro_.promise();
}
void update() {
if (!flag) return;
coro_.resume();
flag = !coro_.done();
processing();
}
handle_type coro_;
};
/*省略*/
task print(std::string str) {
std::string b;
while (1) {
if (b != str) {
for (auto c : str) {
b.push_back(c);
DrawString(0, 0, b.c_str(), 0x000000);
YIELD;
}
}
else {
DrawString(0, 0, b.c_str(), 0x000000);
YIELD;
}
}
co_return;
}
/*インクルードとか省略*/
int WINAPI WinMain(/*引数いっぱい*/) {
/*省略*/
auto DrawString = print("TestString", font);
while(/*メインループの処理とか*/){
DrawString.update();
}
/*省略*/
}
조금만 더 드세요.아직 이루지 못한 것도 있지만.MSVC는 실험용으로도 사용할 수 있습니다!움직였으니까!
그리고 일본어 추가!사실대로 말하면, 온통 알 수 없는 일들뿐이다.
라이선스
라이센스는 CC0입니다.자유롭게 사용하고 변경할 수 있습니다.
참고 자료 C++ 아로마틴 확장 바
C++ 코르크
20분 정도면 C++20 연골소가 느껴져요.
참조의 위 두 개. ↩
Reference
이 문제에 관하여(C++의 Coroutine을 사용했어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/legohasiri/items/e0870b695c5079f76156텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)