ANTICHAT Forum
HOME FORUMS MEMBERS RECENT POSTS LOG IN  
НОВЫЕ ТОРГОВАЯ НОВОСТИ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 02.09.2021, 19:18
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Цитата:
Сообщение от SC6UT  

@Dark_Knight, наверное, говорит про написание DLL библиотек, где создание потоков и взаимодействие с памятью приложения может вызвать UB, к примеру из-за одновременного изменения того же участка памяти, так как это будет довольно сложно предотвратить. В создание самостоятельной программы, в использование потоков я не вижу ничего плохого, но надо уметь с ними работать чтобы не происходили возможные проблемы с ними.
Dark Knight просто немножко чепуху задвигает, потому что это не программист решает, что ему нужна задержка, а в основном так просто стоит задача. Часто сталкиваюсь с UB, например вот артефакты и странные зависания при эмуляции входящих RPC в потоке:

Похожее поведение было при перемещении объектов карты. Грешу на потоки, поэтому и задаю вопрос как лучше всего решать такие задачи, может есть вариант более надёжный и удобный в плане кода.
 
Ответить с цитированием

  #12  
Старый 02.09.2021, 19:55
kin4stat
Флудер
Регистрация: 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: сейчас подумал, и понял что корутины будут использовать такой же принцип работы
 
Ответить с цитированием

  #13  
Старый 02.09.2021, 20:19
Ya Zaregalsya
Постоянный
Регистрация: 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: сейчас подумал, и понял что корутины будут использовать такой же принцип работы
Корутины выглядят непонятно, но многообещающе. Функция, которую можно приостановить — это то, что надо. Надеюсь оно заработает в ГТА и СФ.
 
Ответить с цитированием

  #14  
Старый 03.09.2021, 02:48
Dark_Knight
Флудер
Регистрация: 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
 
Ответить с цитированием

  #15  
Старый 03.09.2021, 03:37
Ya Zaregalsya
Постоянный
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.