PDA

Просмотр полной версии : ktcoro_wait - задержки без потоков


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 (https://github.com/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
.



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 (https://www.blast.hk/redirect/aHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2FsZ2 9yaXRobS9yZW1vdmU)

en.cppreference.com


UPD: Я еблан, там и не надо ничего удалять. @kin4stat (https://www.blast.hk/members/161331/) как оно будет работать на нескольких потоках?

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


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

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

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

SR_team
15.10.2021, 20:54
Починил. Теперь можно гонять таски своего потока, чужого потока, и все таски в приципе.
Также теперь при эвейте другой таски текущая будет ждать окончания выполнения таски которую 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 (https://github.com/KiN4StAt/ktcoro_wait/blob/62e51941db4635d70db367e881c93053fc58623a/include/ktcoro_wait.hpp#L156)

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

github.com


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

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

kin4stat
17.10.2021, 20:03
Зачем тут ссылка на 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
Например, продолжить выполнение через 10 циклов вызовов process()


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

C++:





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



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



Компилятор жалуется на либу за повторное включение, несмотря на #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
Если память не подводит, то inline пробовал, но не сработало. Пришлось перенести эти функции в отдельный .cpp файл, а в .hpp оставить только объявление.


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

Ya Zaregalsya
17.11.2021, 14:03
Попробуй обновить файлы с гитхаба


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



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


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

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