Просмотр полной версии : 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
.
https://forum.antichat.xyz/attachments/27862995/
.
https://forum.antichat.xyz/attachments/27863018/
F0RQU1N and
15.10.2021, 09:42
ахуенно бро
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'нули.
Также теперь можно удалять таски для чужих потоков, и в приципе во всем тасклисте по всем потокам. Небезопасно если вы удаляете таску которая эвейтнула другую таску. Мне слишком лень это фиксить.
Починил. Теперь можно гонять таски своего потока, чужого потока, и все таски в приципе.
Также теперь при эвейте другой таски текущая будет ждать окончания выполнения таски которую 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 файла 👍
Есть ли возможность вызвать co_await с другой функцией и при этом иметь ссылку на ktwait? Мне нужно ожидать выполнения другой функции, но при этом иметь возможность досрочно её завершить. Проблема в том что co_await не работает с ссылкой, а при передачи владения ссылка меняется.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot