Skip to content

WakeUpSignal::waitFor times extended due to MSVC #1134

@snomEIVA

Description

@snomEIVA

A very sleepy MSVC problem

Currently, using Tree::sleep() or Tree::tickWhileRunning() provides unexpected sleep durations using MSVC.

(To my knowledge) Sleep times are rounded up to the nearest 1/64th of a second due to how MSVC/Windows handles thread sleeping.

This is a known quirk of MSVC's conditional / thread sleep implementation.

This behaviour is triggered by the usage of std::condition_variable::wait_for in WakeUpSignal::waitFor(...) here.

Whilst the STL guidelines state that these methods should sleep for at least x amount of time, I've found it frustrating when it's 16x longer than expected with a 1ms wait time.

Simple Solution
A note in the documentation about running at rates indivisible by 1/64th of a second, especially for fast refresh rates.

A much more complicated solution
Adjust how the condition variable times out in the WakeUpSignal::waitFor function for MSVC. I can also put in a PR for this but wanted to raise this as an issue first incase it's outside of scope or whether a note in the documentation would be more suitable. I have implemented a similar fix specialised for MSVC where it does a thread sleep for the duration minus 1/64th of a second followed by a busy wait for the remainder.

As always, thank you for the incredible library and I hope at least this helps someone who might be scratching their head thinking "Why isn't BehaviorTree running faster than 64fps on my Windows machine?"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions