Войти или зарегистрироваться
Выберите удобный способ — аккаунт создастся автоматически.
Или войдите по логину и паролю
 |
|

02.09.2021, 19:18
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от SC6UT
@Dark_Knight, наверное, говорит про написание DLL библиотек, где создание потоков и взаимодействие с памятью приложения может вызвать UB, к примеру из-за одновременного изменения того же участка памяти, так как это будет довольно сложно предотвратить. В создание самостоятельной программы, в использование потоков я не вижу ничего плохого, но надо уметь с ними работать чтобы не происходили возможные проблемы с ними.
Dark Knight просто немножко чепуху задвигает, потому что это не программист решает, что ему нужна задержка, а в основном так просто стоит задача. Часто сталкиваюсь с UB, например вот артефакты и странные зависания при эмуляции входящих RPC в потоке:
Похожее поведение было при перемещении объектов карты. Грешу на потоки, поэтому и задаю вопрос как лучше всего решать такие задачи, может есть вариант более надёжный и удобный в плане кода.
|
|
|

02.09.2021, 19:55
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от kin4stat
Корутины
Либо что-то типа такого
C++:
Код:
static
bool
Process
=
false
;
static
unsigned
long
dwStartTick
{
GetTickCount
(
)
}
;
if
(
Process
&&
GetTickCount
(
)
-
dwStartTick
>
5000
)
{
//Код который должен срабатывать через 5 секунд
Process
=
false
;
}
if
(
NeedToSendMessage
)
{
Process
=
true
;
dwStartTick
=
GetTickCount
(
)
;
NeedToSendMessage
=
false
}
Вместо GetTickCount можно использовать std::chrono::steady_clock()
upd: сейчас подумал, и понял что корутины будут использовать такой же принцип работы
|
|
|

02.09.2021, 20:19
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от kin4stat
Либо что-то типа такого
C++:
Код:
static
bool
Process
=
false
;
static
unsigned
long
dwStartTick
{
GetTickCount
(
)
}
;
if
(
Process
&&
GetTickCount
(
)
-
dwStartTick
>
5000
)
{
//Код который должен срабатывать через 5 секунд
Process
=
false
;
}
if
(
NeedToSendMessage
)
{
Process
=
true
;
dwStartTick
=
GetTickCount
(
)
;
NeedToSendMessage
=
false
}
Вместо GetTickCount можно использовать std::chrono::steady_clock()
upd: сейчас подумал, и понял что корутины будут использовать такой же принцип работы
Корутины выглядят непонятно, но многообещающе. Функция, которую можно приостановить — это то, что надо. Надеюсь оно заработает в ГТА и СФ.
|
|
|

03.09.2021, 02:48
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от Ya Zaregalsya
потому что это не программист решает, что ему нужна задержка, а в основном так просто стоит задача.
А вот про первое ты как раз вообще не прав. Как программист решает, как решить задачу, а не задача решает, как код программисту решить.
и что же за РПЦ ты там эмулируешь, что ловишь такие артефакты?)
Тебе вон выше дали хорошую либу для таймеров. Ты в ГТА вообще забудь про слово поток. Это крайне плохая практика в этом сегменте.
Вот тебе еще одна
GitHub - skyformat99/TimerManager: Crossplatform library for simple working with timers
Crossplatform library for simple working with timers - skyformat99/TimerManager
github.com
|
|
|

03.09.2021, 03:37
|
|
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами:
4714653
Репутация:
98
|
|
Сообщение от Dark_Knight
А вот про первое ты как раз вообще не прав. Как программист решает, как решить задачу, а не задача решает, как код программисту решить.
и что же за РПЦ ты там эмулируешь, что ловишь такие артефакты?)
Тебе вон выше дали хорошую либу для таймеров. Ты в ГТА вообще забудь про слово поток. Это крайне плохая практика в этом сегменте.
Вот тебе еще одна
GitHub - skyformat99/TimerManager: Crossplatform library for simple working with timers
Crossplatform library for simple working with timers - skyformat99/TimerManager
github.com
На видео эмуляция различных RPC для установки позиции и направления камеры, их всего пять примерно, когда-то задавал вопрос по этой теме и ответа так и не нашлось, поэтому сделал через RakNet. Что касается задержек, то программист, к сожалению, время выворачивать не может, если задача требует паузы между действиями (а таких задач 50% на практике), то никуда тут не деться, потоками, таймерами или колбэками всё равно придётся добиваться задержки.
Сообщение от Dark_Knight
А вот про первое ты как раз вообще не прав. Как программист решает, как решить задачу, а не задача решает, как код программисту решить.
и что же за РПЦ ты там эмулируешь, что ловишь такие артефакты?)
Тебе вон выше дали хорошую либу для таймеров. Ты в ГТА вообще забудь про слово поток. Это крайне плохая практика в этом сегменте.
Вот тебе еще одна
GitHub - skyformat99/TimerManager: Crossplatform library for simple working with timers
Crossplatform library for simple working with timers - skyformat99/TimerManager
github.com
По поводу таймера. Правильно ли я понял, что вот эта функция в timer_manager::add_timer сработает как надо только если цикл будет постоянно бегать по ней? Допустим есть основной цикл с !timer_manager:  rocess() и есть функция (допустим ввод команды в игре), которая отрабатывает один раз, в этой функции будет timer_manager::add_timer, оно сработает в таком случае или add_timer нужно вызывать каждую миллисекунду?
|
|
|
|
 |
|
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|