It isn't clear what API you are using to control the CAN hardware. If you are using XNet then you should know that XNet hardware has built in timers, and can perform periodic transmits at specified rates which will rely on the hardware, and won't be effected by the OS, or the system it is running on. It should run just as well on a Pentium 3 as it does a Threadripper.
I cover some of this in my CAN Part 6 blog on XNet, but ideally I think you would use the Frame Output Queued session type.
If you aren't using XNet then there are several software timed options. Here is one solution I made up which keeps track of when each frame has been sent last, and will then figure out how long is the minimum wait time it should wait until the next transmission. I put in a disabled diagram structure which just adds a wait of 1ms between loops but I think this is a better solution if it works.