ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.io/forumdisplay.php?f=24)
-   -   ktcoro_wait - задержки без потоков (https://forum.antichat.io/showthread.php?t=1404686)

kin4stat 14.10.2021 20:46

ktcoro_wait​Приостановка выполенения функции на время основанное на корутинах C++20

Примеры кода​

C++:





[CODE]
#include
#include
#include "ktcoro_wait.hpp"
ktwait
bar
(
)
{
using
namespace
std
::
chrono_literals
;
while
(
true
)
{
std
::
cout



Download & Source:

GitHub - kin4stat/ktcoro_wait

Contribute to kin4stat/ktcoro_wait development by creating an account on GitHub.

github.com

memir 14.10.2021 20:52

.

https://forum.antichat.xyz/attachments/27862995/

sc6ut 14.10.2021 21:05

Цитата:

Сообщение от memir

.

https://forum.antichat.xyz/attachments/27863018/

F0RQU1N and 15.10.2021 09:42

ахуенно бро

SR_team 15.10.2021 16:48

remove_if же не удаляет элементы по настоящему, только меняет итераторы

std::remove, std::remove_if - cppreference.com

en.cppreference.com


UPD: Я еблан, там и не надо ничего удалять. @kin4stat как оно будет работать на нескольких потоках?

UPD2: Проверил сам потоки. Все корутины катчатся в инстанс потока main. И bar, который вызывает co_wait из потока t1, продолжает свое выполнение уже в потоке main

C++:





[CODE]
#include
#include
#include
#include "include/ktcoro_wait.hpp"
ktwait
bar
(
)
{
using
namespace
std
::
chrono_literals
;
while
(
true
)
{
std
::
cout


kin4stat 15.10.2021 20:06

Цитата:

Сообщение от SR_team

UPD2: Проверил сам потоки. Все корутины катчатся в инстанс потока main. И bar, который вызывает co_wait из потока t1, продолжает свое выполнение уже в потоке main

Починил. Теперь можно гонять таски своего потока, чужого потока, и все таски в приципе.

Также теперь при эвейте другой таски текущая будет ждать окончания выполнения таски которую co_await'нули.

Также теперь можно удалять таски для чужих потоков, и в приципе во всем тасклисте по всем потокам. Небезопасно если вы удаляете таску которая эвейтнула другую таску. Мне слишком лень это фиксить.

SR_team 15.10.2021 20:54

Цитата:

Сообщение от kin4stat

Починил. Теперь можно гонять таски своего потока, чужого потока, и все таски в приципе.
Также теперь при эвейте другой таски текущая будет ждать окончания выполнения таски которую co_await'нули.
Также теперь можно удалять таски для чужих потоков, и в приципе во всем тасклисте по всем потокам. Небезопасно если вы удаляете таску которая эвейтнула другую таску. Мне слишком лень это фиксить.

а нельзя несколько инстансов завести? Просто в текущей реализации пока выполняются корутины из одного потока, корутины другого потока спят, а до вызова co_wait может быть очень тяжелая операция

kin4stat 16.10.2021 16:21

UPDATE:

Добавлено создание пользовательских инстансов тасклистов.

Также теперь можно безопасно удалять таски из очереди

legendabrn 17.10.2021 19:05

ktcoro_wait/include/ktcoro_wait.hpp at 62e51941db4635d70db367e881c93053fc58623a · kin4stat/ktcoro_wait

Contribute to kin4stat/ktcoro_wait development by creating an account on GitHub.

github.com


Зачем тут ссылка на ktwait?

upd: приведи пример удаления таска

kin4stat 17.10.2021 20:03

Цитата:

Сообщение от legendabrn

Зачем тут ссылка на ktwait?

А как ты еще представляешь себе удаление таска?

Ya Zaregalsya 29.10.2021 16:43

add_task() будет работать с лямбда функциями?

Такая проблема, заголовочный файл обсыпан ошибками, мол std не содержит никаких корутинов. Что можно сделать в такой ситуации?
https://forum.antichat.xyz/attachments/27873056/

https://forum.antichat.xyz/attachments/27873056/

UPD: Исправил ошибку. Нужно было перейти на самый свежий стандарт языка.

Лямбды на месте 👍

C++:





Код:

tasklist
.
add_task
(
[
]
(
int
first
,
bool
second
)
->
ktwait
{
using
namespace
std
::
chrono_literals
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"#1 First: %i; Second: %d;"
,
first
,
second
)
;
co_await
5
s
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"#2 First: %i; Second: %d;"
,
first
,
second
)
;
}
,
3
,
true
)
;


Ya Zaregalsya 03.11.2021 15:49

Удобная либа. Лямбды делаются легко. Возник только такой вопрос, можно ли как-то уйти ото всех этих секунд и миллисекунд, и работать чисто по кол-ву вызовов process()? Например, продолжить выполнение через 10 циклов вызовов process(). Сделал два tasklist, один вызывается в потоке, другой в хуке на рендер, чтобы один вызывать по времени, а другой по кадрам. Но если передавать в co_await обычное число, то размер этого числа ни на что не влияет:

C++:





Код:

#pragma once
#include "SAMPFUNCS_API.h"
#include "game_api.h"
#include
#include "ktcoro_wait.hpp"
extern
SAMPFUNCS
*
SF
;
extern
ktcoro_tasklist threadTask
;
extern
ktcoro_tasklist presentTask
;
namespace
examples
{
void
testktcoro
(
)
{
SF
->
getSAMP
(
)
->
registerChatCommand
(
"testktcoro"
,
[
]
(
std
::
string param
)
->
void
{
threadTask
.
add_task
(
[
]
(
)
->
ktwait
{
while
(
true
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"threadTask"
)
;
co_await
1
;
}
}
)
;
presentTask
.
add_task
(
[
]
(
)
->
ktwait
{
while
(
true
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"presentTask"
)
;
co_await
1
;
}
}
)
;
}
)
;
}
}





Компилятор жалуется на либу за повторное включение, несмотря на #pragma once во всех файлах проекта. Конкретно на функции remove_task и remove_task_recursively.

kin4stat 16.11.2021 19:38

Цитата:

Сообщение от Ya Zaregalsya

Например, продолжить выполнение через 10 циклов вызовов process()

хз зачем это может понадобиться, но как костыль:

C++:





[CODE]
for
(
auto
i
=
0u
;
i



Да-да умею отвечать вовремя

Цитата:

Сообщение от Ya Zaregalsya

Компилятор жалуется на либу за повторное включение, несмотря на #pragma once во всех файлах проекта. Конкретно на функции remove_task и remove_task_recursively.

Попробуй вот эти две функции отметить как inline

https://forum.antichat.xyz/attachments/27889910/

Ya Zaregalsya 17.11.2021 13:14

[QUOTE="kin4stat"]

хз зачем это может понадобиться, но как костыль:

C++:





[CODE]
for
(
auto
i
=
0u
;
i

kin4stat 17.11.2021 13:48

Цитата:

Сообщение от Ya Zaregalsya

Если память не подводит, то inline пробовал, но не сработало. Пришлось перенести эти функции в отдельный .cpp файл, а в .hpp оставить только объявление.

Попробуй обновить файлы с гитхаба

Ya Zaregalsya 17.11.2021 14:03

Цитата:

Сообщение от kin4stat

Попробуй обновить файлы с гитхаба

Завтра сяду за код, попробую такой вариант. Но вынос определения этих функций в отдельный .cpp файл помог, если что, всё работает идеально.

Цитата:

Сообщение от kin4stat

Попробуй обновить файлы с гитхаба

Теперь всё работает без дополнительного .cpp файла 👍

SKIC 14.05.2022 11:02

Есть ли возможность вызвать co_await с другой функцией и при этом иметь ссылку на ktwait? Мне нужно ожидать выполнения другой функции, но при этом иметь возможность досрочно её завершить. Проблема в том что co_await не работает с ссылкой, а при передачи владения ссылка меняется.


Время: 12:30