Harder Than It Seems? 5 Minute Timer in C++

  Рет қаралды 142,566

The Cherno

The Cherno

Ай бұрын

To try everything Brilliant has to offer-free-for a full 30 days, visit brilliant.org/TheCherno . You’ll also get 20% off an annual premium subscription.
Patreon ► / thecherno
Instagram ► / thecherno
Twitter ► / thecherno
Discord ► / discord
Timer thread ► cplusplus.com/forum/beginner/...
Why I don't "using namespace std" ► • Why I don't "using nam...
Hazel ► hazelengine.com
🕹️ Play our latest game FREE (made in Hazel!) ► studiocherno.itch.io/dichotomy
🌏 Need web hosting? ► hostinger.com/cherno
💰 Links to stuff I use:
⌨ Keyboard ► geni.us/T2J7
🐭 Mouse ► geni.us/BuY7
💻 Monitors ► geni.us/wZFSwSK
This video is sponsored by Brilliant.

Пікірлер: 577
@TheCherno
@TheCherno 28 күн бұрын
So… got any more comedy for me to look at? 👇 Also don’t forget you can try everything Brilliant has to offer-free-for a full 30 days, visit brilliant.org/TheCherno . You’ll also get 20% off an annual premium subscription.
@shafiullahptm909
@shafiullahptm909 28 күн бұрын
bro i really love your videos can you pls make a c++ one shot video pls
@Silencer1337
@Silencer1337 28 күн бұрын
I'm interested to learn how you would cap the framerate when vsync is off. I've always looked for alternatives to sleep() because it likes to oversleep, but never found anything.
@heavymetalmixer91
@heavymetalmixer91 28 күн бұрын
Given that you're using the standard library in this video I'd like to ask: As a game engine dev what's your opinion on the standard library? Most game devs out there tend to avoid it but I'm not sure why.
@theo-dr2dz
@theo-dr2dz 27 күн бұрын
@@heavymetalmixer91 Standard library design and implementations are optimised on correctness and generality. That can be suboptimal on performance. For example, the standard library calendar implementation is designed to get leap seconds right. That will probably not be relevant for games but it will never be completely free. Also the standard library uses exceptions quite extensively and exceptions create some unpredictability in timing. So, if you really need ultimate performance and every cpu cycle counts, like in AAA games, high frequency trading and that kind of applications, creating some kind of custom implementation of the standard library (or some kind of alternative for it) can be worth the effort. But generally C++ code is very fast, even without doing all kinds of optimisation tricks. I would say the standard library implementations in leading compilers are fine, except in really cutting edge performance critical situations.
@Brahvim
@Brahvim 27 күн бұрын
​@@heavymetalmixer91I don't know as much as other people around here, but I like to think that the reason why it's so is because there are new edge cases for them to know of, it takes up space wherever it's taken, it may use a few `virtual`s around the place, I think, so... mostly because it's a library, the implementation of which, they don't know a lot about! It _does_ make life easier once one gets into its mindset, though.
@dhjerth
@dhjerth 19 күн бұрын
I am a Python programmer and this is how I would solve it: import os import sys import time # All done, Python takes 5 minutes to start
@madking3
@madking3 15 күн бұрын
I usually create list with 500 random numbers and sort it with bubble sort it gives me 5 min best case
@jongeduard
@jongeduard 15 күн бұрын
Yeah, but let's also talk about performance in Python and how you want to compare it to anything like C, C++ or Rust.
@thuan-jinkee9945
@thuan-jinkee9945 12 күн бұрын
Hahahah
@MunyuShizumi
@MunyuShizumi 11 күн бұрын
​@@jongeduard whoosh
@iritesh
@iritesh 11 күн бұрын
​@@jongeduardwooosh
@christopherweeks89
@christopherweeks89 28 күн бұрын
Remember: this is the stuff we’re training our AI on
@monad_tcp
@monad_tcp 28 күн бұрын
job security for humans
@enzi.
@enzi. 28 күн бұрын
@@monad_tcp 😂😂
@Avighna
@Avighna 27 күн бұрын
💀☠️💀☠️💀
@platin2148
@platin2148 27 күн бұрын
It doesn’t matter as LLMs have inherited fuzziness as them being a statistic model.
@codinghuman9954
@codinghuman9954 27 күн бұрын
good
@systemhalodark
@systemhalodark 28 күн бұрын
Trolling is a art; Topnik1 is a true artist.
@mabciapayne16
@mabciapayne16 28 күн бұрын
an* ( ͡° ͜ʖ ͡°) And I don't think he made a bad code on purpose.
@user-bq9jp7bl5p
@user-bq9jp7bl5p 28 күн бұрын
@@mabciapayne16 trolling is art, and @systemhalodark is an true artist
@mabciapayne16
@mabciapayne16 28 күн бұрын
@@user-bq9jp7bl5p You should really learn English articles, my dear friend ( ͡° ͜ʖ ͡°)
@mabciapayne16
@mabciapayne16 28 күн бұрын
@@user-bq9jp7bl5p a true artist* ( ͡° ͜ʖ ͡°)
@benhetland576
@benhetland576 28 күн бұрын
And top it off with a recursive call _#seconds_ deep instead of iterating, just to increase the chance of stack overflow on a long waits I assume.
@kleoCodes
@kleoCodes 28 күн бұрын
I'd never think i would ever spend 20 minutes to watch a 11 year old post about a 5 minute timer. but i learned something Edit: 350 likes??? Damn i must be famous
@monkeywrench4166
@monkeywrench4166 4 күн бұрын
He doesn't look 11 year old tbh
@TwistedForHire
@TwistedForHire 18 күн бұрын
Funny. I am an office application engineer and my first thought at looking at your code was "noooooo!!!" We try to use as little resources as possible and a 5ms constant loop is "terrible" for battery life. It's funny how people from different coding worlds approach a problem different. My first instinct was much closer to the sleep/wait implementation (though I wouldn't waste an entire thread just to wait).
@Brenden.smith.921
@Brenden.smith.921 18 күн бұрын
I was thinking the same thing. I would've had a thread sleeping and then doing whatever needs to be done after the sleep timeout using a callback. If there was a need to share data with the main thread and I didn't want to do safe multi threading I'd use a signal to interrupt the main thread (unless it was something that wasn't very important, unless, unless, unless). Looping over and over like that and sleeping for 10ms is the exact same solution as the second guy except he slept for 1s which is what was laughed at, but it's fundamentally the same solution. Just a lot sloppier.
@wi1h
@wi1h 16 күн бұрын
@@Brenden.smith.921 as for your second point, it's not the same. the "game loop" solution presented is off from the final by at most 5 ms, the second solution from the thread is off by (loop processing time required) * (loop iterations, in that case 300)
@RepChris
@RepChris 11 күн бұрын
As with anything "engineering" (to clarify: coding and CS has a lot of stuff that's sitting in the fuzzy zone between science and engineering, not trying to knock your status as an engineer), there isnt one "best" solution, even just by cost and development time being in the picture. In a game engine the (relatively) minuscule overhead doesn't matter since youre doing a lot of other stuff per frame/simulation step which is way way more costly, and the inaccuracy youre going to get is probably a nonissue since a game generally doesn't need a 5 minute timer to be accurate down to the millisecond. So the time spend thinking about a better solution and implementing it is going to be better spent working on something more important. Completely different picture for something that needs to be very accurate, or actually power/compute efficient (which games certainly are not in any capacity, at least 99+% of them)
@youtubehandlesux
@youtubehandlesux 6 күн бұрын
Me writing a video game and trying to make it stable up to 300 fps: A whopping 5ms??? In this economy???
@livinghypocrite5289
@livinghypocrite5289 3 күн бұрын
Yeah, coming from yet another background, I immediately catched other stuff. Just reading the original problem my immediate question was: How accurate does the timer need to be? Because I constantly have to explain people, that I can't give them millisecond accuracy on an operating system, that isn't a real time OS. So, I saw the Sleep solution and my immediate reflex was: That isn't going to be accurate, because a Sleep tells the OS to sleep at least that amount of time, so the OS can decide to wake my application at a later time. Could be fine, but this depends on how accurate the timer needs to be. Also when seeing the recursive function, I also noticed the stack usage of that solution, but also the problem, that a loop is simply faster than a recursive function, because a function call has overhead, building that stack takes CPU time, so simply by calling the function recursively the timer will get more inaccurate, without even looking at how long the stuff that is executed while running the timer takes.
@AJMansfield1
@AJMansfield1 18 күн бұрын
As a firmware engineer, my first instinct was "set the alarm peripheral to trigger an interrupt handler"
@jamesblack2719
@jamesblack2719 12 күн бұрын
That was my thought also, but I come at it from a C background and his approach just didn't seem elegant. It seems overly complicated on something that is rather simple to do. Shame AI will be trained on this approach.
@cpK054L
@cpK054L 10 күн бұрын
Wtf is an alarm peripheral? Did you mean Timer?
@AJMansfield1
@AJMansfield1 10 күн бұрын
@@cpK054L on a system with a free-running continuously-increasing system clock, you set the alarm register to generate an interrupt when that system clock reaches the set value - in this case, you'd take the current time, add two minutes worth of clock ticks to that value, and set the alarm to that value.
@3xtrusi0n
@3xtrusi0n 8 күн бұрын
@@cpK054L MCU's have hardware timers that you can use without consuming a thread. Depending on the CPU and type of timer implemented (in hardware), you can have it trigger a hardware interrupt which will then kick off a given task/instruction. It's a peripheral alarm, because it is a peripheral on the hardware/MCU. You can also call it a timer, but either name means the same. Alarm would indicate you are 'counting down' and timer would indicate you are 'counting up'.
@cpK054L
@cpK054L 8 күн бұрын
@3xtrusi0n I've never heard jt called an alarm. Also, timers don't have "counters" from what I've seen...they only have flag bits The ISR just waits for it to raise then you must reset otherwise it do t work the next cycle
@akashpatikkaljnanesh
@akashpatikkaljnanesh 28 күн бұрын
You want your users to hate you? Tell the user in the console to set a timer for 5 minutes, wait for them to press space and start the timer, and press space to finish it. :)
@no_name4796
@no_name4796 28 күн бұрын
Just have the user manually update the timer at this point...
@HassanIQ777
@HassanIQ777 28 күн бұрын
just have the user manually write the code
@dandymcgee
@dandymcgee 28 күн бұрын
just have the user go touch grass, then they won't need a timer.
@akashpatikkaljnanesh
@akashpatikkaljnanesh 27 күн бұрын
​@@dandymcgeeWonderful idea
@DasHeino2010
@DasHeino2010 22 күн бұрын
Just have the user prompt ChatGPT! :3
@add-iv
@add-iv 21 күн бұрын
sleep doesn't take any cpu resources during the sleep time since the thread will be put into the pending queue (on most OS). Periodically checking will consume CPU time, even if it is minimal, and is a very Game Engine like solution.
@LosManexStudio666
@LosManexStudio666 14 күн бұрын
Isn't creating a thread expensive by itself?
@tylisirn
@tylisirn 13 күн бұрын
@@LosManexStudio666 Sleep isn't creating any threads, it puts the calling thread to sleep.
@LosManexStudio666
@LosManexStudio666 13 күн бұрын
@@tylisirn okay, makes sense
@Abc-jq4oz
@Abc-jq4oz 2 күн бұрын
So who checks the OS’s pending queue then? And how often?
@tylisirn
@tylisirn 2 күн бұрын
@@Abc-jq4oz The OS's task scheduler does in conjunction with hardware. The scheduler maintains a priority queue which has all tasks organized by priority and when they need to wake up. When a task finishes its timeslice the scheduler looks at the next task in the priority queue and if it's ready to execute, it executes it. If the next task is not ready to execute the OS sets a hardware timer to raise an interrupt when the next task is scheduled to run and puts the CPU into low power sleep state (usually ACPI state C1 (halted) or C2 (stopped clocks), these days even C3 state (deep sleep) is used for ultra low power computing when on battery power; in C3 state most of the CPU core is powered down and caches are allowed to go stale requiring cache refresh when the CPU reactivates). The hardware interrupt wakes up the CPU at the scheduled time.
@Kazyek
@Kazyek 28 күн бұрын
Good video overall, but the part about precision at 15:21 is a bit lacking. To be honest, precision is most likely not very important when sleeping for 5 minutes, but the overall takeaway of how sleep work is a bit wrong. Sleep will sleep for *AT LEAST* the time specified, but could sleep for quite a bit longer depending on other task's CPU utilization, the HPET (Hardware Precision Event Timer) used by the system (or not, on some system there might not even be one), the OS's timer resolution settings, the virtual timer resolution thing that windows do on laptops for powersaving where it will actually stretch the resolution, etc etc... Therefore, when very high precision is desired (for example, a frame limiter in a game, to have smooth frame pacing), you don't want to sleep all the way, but rather, sleep for a significant portion of the time, but busy-loop at the end. This fundamental misunderstanding of how sleeping work is why so many games have built-in frame limiters with absolutely garbage frame-pacing, and that you get a much smoother experience by disabling it and using something like RTSS's frame limiter instead.
@Kazyek
@Kazyek 28 күн бұрын
And by "quite a bit longer", I mean that on a windows laptop in default configuration, a sleep(1ms) might sleep for over 15ms sometimes!
@Fs3i
@Fs3i 19 күн бұрын
Yeah, “make something happen at x time” is a hard problem, and really hard (near impossible) to write in a portable fashion
@shadowpenguin3482
@shadowpenguin3482 18 күн бұрын
When I was younger I was always surprised how sleeping for 0ms is much slower than sleeping for 1 ms
@JohnRunyon
@JohnRunyon 4 күн бұрын
You can get pre-empted anyway. If you need to guarantee it'll happen at an exact moment then you should be using an RTOS. Thankfully you almost never actually need to guarantee that. A frame limiter should be maintaining an average, not using a constant delay, and then it won't even matter if the OS delays you for 15ms. Btw, a 15ms jitter is completely and totally unnoticeable.
@asteriskman
@asteriskman 28 күн бұрын
"Train the AI using the entire internet, it will contain all of human knowledge." The AI: "derp, but with extraordinary confidence"
@Pablo360able
@Pablo360able 16 күн бұрын
this explains so much
@scowell
@scowell 25 күн бұрын
In embedded land we have real timers! Talk about accurate... sub-nanosecond is easily doable. Overhead? It's a peripheral! Ignore it until it interrupts you.... or have it actually trigger an output without bothering you if you really need that accuracy. Love timers.
@JohnSmith-pn2vl
@JohnSmith-pn2vl 19 күн бұрын
time is everything
@gonun69
@gonun69 11 күн бұрын
They are great but you better have the datasheet and calculator ready to figure out how you need to set them up.
@RepChris
@RepChris 11 күн бұрын
@@gonun69 thats the case for pretty much everything embeded
@muschgathloosia5875
@muschgathloosia5875 11 күн бұрын
@@gonun69 I can't imagine you would ever not have the datasheet ready
@scowell
@scowell 10 күн бұрын
@@gonun69 Exactly... gets easier when using a PLL to run the clock... I do this for syncing to video.
@peterjansen4826
@peterjansen4826 19 күн бұрын
A game-developer who cautions to not use OS-dependent libraries. Music in my Linux-gaming ears. 😉
@cubemaster1298
@cubemaster1298 28 күн бұрын
I am not trying to protect topnik1's code in the video, it is pretty bad indeed BUT I am pretty sure it is not going to be 300 stack frames deep. From the looks of it, it is a tail recursive function, so any major compiler (e.g. clang) will do tail call optimization.
@jfmhunter375
@jfmhunter375 20 күн бұрын
This should be higher
@JuniorDjjrMixMods
@JuniorDjjrMixMods 7 күн бұрын
But then you would be expecting for the compiler to fix a problem that shouldn't exist...
@MeMe-gm9di
@MeMe-gm9di 5 күн бұрын
@@JuniorDjjrMixMods Tail Call Optimization is often required to write certain algorithms "pretty", so it's often guaranteed.
@andersonklein3587
@andersonklein3587 28 күн бұрын
I'm surprised no one brought up interrupts, I don't know about modern C++, but I've seen in old school assembly this concept of setting a "flag" that interrupts execution and calls/executes a function before handing back the CPU.
@MrHaggyy
@MrHaggyy 28 күн бұрын
On embedded devices, this works like a charm as dozens of timers are running all your peripherals. So you pick one of them and derive a logic for all the other timed events
@sopadebronha
@sopadebronha 28 күн бұрын
This was literally the first thing that came to my mind. I think it's the instinctive solution for a firmware programmer.
@sinom
@sinom 28 күн бұрын
I'm not an embedded programmer so I might just not know something, but afaik the C++ stl doesn't provide any device agnostic way of handling interrupts, so anything you do with interrupts will always be hardware dependent and non portable. If you are using some specific microcontroller and don't care about portability then interrupts would probably be a good way of handling the problem.
@fullaccess2645
@fullaccess2645 28 күн бұрын
If I want to run the callback on the main thread, could interrupts avoid the while loop that checks for the task queue?
@sopadebronha
@sopadebronha 28 күн бұрын
@@fullaccess2645 That's the whole point of interrupts.
@brawldude2656
@brawldude2656 28 күн бұрын
I recently made a discord bot. The task was giving every user a cooldown timer. Well at first glance it may seem like an insane task but once you realise time just goes on you don't have to do any computation meanwhile. You can just compare start and end whenever user needs to be updated. And this is how many village/base building games use on their playerbase. Like for example you need a buliding that takes 3 days to bulids. When the player is online you can just update every second but when the player is offline you can have the end date and compare to that when the player logs in again. Or someone interacts with that user.
@theairaccumulator7144
@theairaccumulator7144 28 күн бұрын
Duuh like if you can't figure this out you really shouldn't touch an ide
@boycefenn
@boycefenn 27 күн бұрын
​@theairaccumulator7144 asshole alert!
@brawldude2656
@brawldude2656 27 күн бұрын
@@theairaccumulator7144 there are many people who can't even get close to figuring this out I'm not even kidding
@Brahvim
@Brahvim 27 күн бұрын
Lazy-loading, pretty much, right?! Nicely used as always! Some things are okay to do right before their consequences are needed...
@Brahvim
@Brahvim 27 күн бұрын
@@theairaccumulator7144 Don't act so, please...
@motbus3
@motbus3 28 күн бұрын
Fork Execve bash -c sleep 5
@yoshi314
@yoshi314 28 күн бұрын
isn't that 5 seconds wait?
@sadhlife
@sadhlife 28 күн бұрын
sleep 300
@ProtossOP
@ProtossOP 28 күн бұрын
@@yoshi314easy fix, just multiply by 60
@Pritam252
@Pritam252 28 күн бұрын
MS Windows be like:
@no_name4796
@no_name4796 28 күн бұрын
Or bash -c sleep 300 on linux...
@Reneg973
@Reneg973 26 күн бұрын
... And then you notice that your 5sec timer needs 5.03sec on your first PC. On the second it takes 5.1s and after some debugging you find out the OS moved the thread onto an E core and that your thread priority was not high enough. Would be nice to extend this video to handle more details. Like higher+highest accuracy or lower+lowest CPU usage.
@sumikomei
@sumikomei 28 күн бұрын
at first glance I totally didn't read "using namespace std::cherno_literals;"
@ADAM-qd9bi
@ADAM-qd9bi 28 күн бұрын
I’ve always thought of us, and used to always misspell it with “cherno” 😭
@pastasawce
@pastasawce 28 күн бұрын
Yeah def getting into thread pool territory. Would love to see more on this.
@inulloo
@inulloo 28 күн бұрын
Your analysis and explanation were very helpful.
@TryboBike
@TryboBike 28 күн бұрын
This threaded timer has subtle bug. If 'work' performed during the timer duration takes longer than the timer itself then after the timer concludes its scheduled work will need to wait for the 'join' thus delaying the execution by more than the 5 minutes. On the flip side - moving the 'timer' callback to the timer thread will require work of main and 'timer' to be concurrent which brings its own set of problems. Frankly - having any sort of 'delayed' execution done in a single thread whil stuff is happening during the wait period is a pretty difficult problem to tackle. Unless it is something like a game, where there is a game loop or an event driven application. But even then, depending on resolution of the loop the wait period might be very, very different to what was specified.
@delta3244
@delta3244 10 сағат бұрын
That's not what thread::join() does. thread::join() has _no effect_ on the thread corresponding to the std::thread it is called on. It only affects the thread which calls thread::join(), by making it block until the std::thread which .join() was called on finishes. Without thread::join() at the end of main(), the code following the timer would fail to run if main ended before the timer did. That's why it exists. To reiterate: it does not tell the timed thread to do any work. It tells the main thread to wait for the timed thread's work to finish before ending the program. The timed thread does work on its own, once the OS wakes it up (which will happen sometime after the sleep duration).
@nenomius1148
@nenomius1148 28 күн бұрын
Шел Черно по интернету, увидел форум, заглянул в него и сгорел.
@phusicus_404
@phusicus_404 3 күн бұрын
🤡
@KieranDevvs
@KieranDevvs 28 күн бұрын
The best solution for this is asynchronous execution. That way you can decide how the execution is performed i.e on the same thread or on a separate thread, and when the execution / timer is complete, you can decide if you want to rejoin the execution context (thread) back to main and take the perf hit, or run your logic on the background thread without any perf hit. You get all the benefits i.e you don't need to worry about thread safety and its fully configurable in how you want it to run.
@phusicus_404
@phusicus_404 3 күн бұрын
Wonderful, how to do it in C++?
@KieranDevvs
@KieranDevvs 3 күн бұрын
@@phusicus_404 std::async? I thought that was pretty obvious.
@phusicus_404
@phusicus_404 3 күн бұрын
@@KieranDevvs he used this in his code, you use it in other way then
@KieranDevvs
@KieranDevvs 3 күн бұрын
@@phusicus_404 Nope, the way shown in the video is correct more or less. The thread sleeping is bad, but apart from a few fixes, the general premise is there. If you put the thread to sleep and don't use a state machine to allow the thread to return, you block the main thread in async cases where you only use one thread (mainly in cases where you're using a UI).
@trbry.
@trbry. 28 күн бұрын
love this kind of content almost as much as your other content, be it hazel coding reviews and more
@not_herobrine3752
@not_herobrine3752 28 күн бұрын
My way would include obtaining a timestamp at the beginning, checking every iteration of the application loop whether the time elapsed is greater than or equals the start time, then doing whatever if said condition was true
@ruix
@ruix 28 күн бұрын
This is also what I thought
@R23874
@R23874 28 күн бұрын
This is such a great video topic!
@Chriva
@Chriva 28 күн бұрын
Condition signals is probably something you want with huge delays like that. Especially if you want to exit cleanly without waiting forever
@ccgarciab
@ccgarciab 19 күн бұрын
Do you mean std::condition_variable?
@Chriva
@Chriva 19 күн бұрын
@@ccgarciab That would also work but it's really finicky to use with non-static bools (ie it's hard to spin up several instances of the same thing)
@ccgarciab
@ccgarciab 19 күн бұрын
@@Chriva what's the name of the API that you're referring in your original comment then?
@oleksandrpozniak
@oleksandrpozniak 28 күн бұрын
As an embedded developer I like to use SIGALRM and handler in case I'm sure that I'll need to have one timer only at the same time. If I need to have several timers I use timer_create aka Linux timers.
@lukiluke9295
@lukiluke9295 28 күн бұрын
Wow your first Video on multithreading and you introduced async, threads, sleep and context. I was actually looking for a video on the topic of multithreading this morning - couldn't find one and now here it is, just a little bit more complex ^^
@akashpatikkaljnanesh
@akashpatikkaljnanesh 25 күн бұрын
This isn't his first video on multithreading I believe
@rogercruz1547
@rogercruz1547 2 күн бұрын
25 years ago when I started coding I took setTimeout and setInterval in ActionScript for granted, I was 8. Now I was thinking of a thread with a loop and events that trigger callbacks as other threads depending on timers you set that would mimick that behaviour but when you mentioned Promises I realized it would be way easier to open a thread for each timer and just sleep...
@aakashgupta6285
@aakashgupta6285 27 күн бұрын
As an embedded engineer, I would just use a built-in timer interrupt, which should be available for all platforms, although not portable.
@virkony
@virkony 27 күн бұрын
9:21 for that case tail call elimination should fire unless there were stack allocations done in "dowhatuwantinmeantime". So it effectively turns into jump to beginning of function.
@woobilicious.
@woobilicious. 27 күн бұрын
I was thinking about the "busy wait" issue you end up with in game loops, especially if you need to serialize timers / handle game saves when the user quits, and I came up with, storing all your deferred functions in a heap/priority queue, and then just check the head of the queue, and sleep for that amount of time, if you have a DSL, you could potentially have your code look like "bad" code that just calls sleep(), but really it's just a co-routine that yields the CPU.
@vloudster
@vloudster 26 күн бұрын
Great video. You should do more videos like this where you are looking at fundamental things like timers etc. The video was funny in relation to the code suggestions in the forum but also educational when you explained them and presented your professional solution.
@robwalker4653
@robwalker4653 Күн бұрын
For the first idea example you showed I would have just calculated now + 5 mins when the timer is created, store that time as target time. Check in loop if current time is greater or equal to the target time, if so, the timer has triggered. Rather than casting a duration of one time minus the other each loop.
@sayo9394
@sayo9394 27 күн бұрын
This is a great video 👏 I vote Yes for more videos of this format
@sub-harmonik
@sub-harmonik 28 күн бұрын
generally the extensible way is to maintain a priority queue that contains time values and callbacks. Every loop poll the first element of the priority queue and remove until the time value > current time. That way you can have as many timers as you like. Things get way more complex if you need accurate sleep without spinning though. You pretty much need to get into platform-specific api as well as setting certain thread priority/interrupt rate. Recent windows has pretty weird and relatively undocumented timer handling.
@kuhluhOG
@kuhluhOG 18 күн бұрын
17:15 Btw, small nitpick for the C++14 users (and above): move your callback into the lambda capture, because if the callback is an object with a defined operator() (like a lambda), there could be big-ish members (like with a lambda capture).
@mikefochtman7164
@mikefochtman7164 20 күн бұрын
We had to run code in 'real-time' in the sense of training simulators. This means we had to perform a lot of calculations, then do I/O interfacing with the student's control panels in a way that the student couldn't tell the difference between the simulator and the actual control room. So update the I/O with new calculation results at LEAST every 250 ms. I know sounds slow by gaming standards, but we did a LOT of physics calculations for an entire power plant. So we set up what had to be done in each 'frame' and used a repeating interrupt timer configuration. A frame ran doing calcs and I/O then sleeps until the next interrupt. If we occasionally 'miss' an interrupt because the calcs took too long, we had to 'catch up' the next frame. (one way to do this was the interrupt service routine increment a simple frame_counter and main loop checks if we 'missed' an incremental step) For time delays, we simply did a counter in the main code that would count up to 'x' value because we knew each time the code executed it was 'delta-time' step since last execution. So for 5 minutes at a frame time of 250 ms, simply count up to 1200. This was a few years back, but you can see it's similar to your 'game engine' concept.
@abraxas2658
@abraxas2658 3 күн бұрын
19:34 If I wanted it to happen on the main thread, I'd probably have a game loop (as you showed) but with an integrated event system. This would be implemented as a min-heap with the time it should be called at as the value being sorted on. Then all timers could be checked with a single comparison. (If the lowest time has not been reached, all the others are guaranteed not to have been reached.) At this point though, we are very close to a full game engine core haha
@TaskForge
@TaskForge 27 күн бұрын
I’ve actually learnt so much from this channel. Since There’s not a single good explanation of inline functions anywhere on KZbin could you please cover that in your next video? Or sometime in the future
@delta3244
@delta3244 10 сағат бұрын
An inline function is one which must be defined within each translation unit where it is used, and it is one which can be defined in multiple translation units so long as all definitions are identical. The intent behind 'inline' was originally to say "instead of compiling this function and calling it, embed its code directly into all places where it is used." Today, it more means "this will be defined identically in multiple locations, and all those definitions will refer to the same thing."
@xlerb2286
@xlerb2286 15 күн бұрын
Just shows that nothing is simple. What type of app are you working with? Do you need the thread to remain alive while the timer is running? Do you care about multi-platform? How much accuracy do you need? How important is it that code have low processing overhead? And the list goes on. (And that recursive example is going to keep me awake tonight, it takes a special type of person to write code like that)
@pschichtel
@pschichtel 8 күн бұрын
The 300 stack frames comment on the recursive function... there is a thing called tail call optimization, which apparently C++ compilers have been doing a while, that optimizes this into a loop. There is quite a few people that think more in recursion than in iteration, especially in a functional context. the async vs thread thing is nitpicking for the sake of it. there is really no advantage to be had _here_ by using async instead of just directly spawning a thread. you don't gain control, you don't gain performance, you are just obscuring the fact that a thread is spawned and suspended by wrapping it up in async. And when this async stuff get's put into a context where this might be scheduled into a thread pool, now you have a thread from the pool blocked for 5 minutes. From game engines you are probably used to cooperative multi tasking, which could have been an interesting spin and the one solution being bashed from the forum actually describes the idea of cooperative multi tasking, albeit with some problems.
@jamesmackinnon6108
@jamesmackinnon6108 14 күн бұрын
I remember when I was first starting programming I learned visual basic script (Why I chose that I have no idea), and I was looking up how to wait for a period of time and ended up on a forum that said the way to set a timer was to ping google, figure out how long that took, and then divide the time you want to wait by the length of the ping and ping google that amount of times.
@tunk_2ton168
@tunk_2ton168 5 күн бұрын
I also have chosen this path. I chose vbs because it doesn't require much. Literally just open notepad and you are good to go and its easy to learn. What did you move onto from that?
@hamiltonw3242
@hamiltonw3242 27 күн бұрын
Very practical example in real world application!!
@jongeduard
@jongeduard 15 күн бұрын
Yeah people can really think in too simple ways about such a thing, but that forum thread was really bad. LOL. As someone with experience for many years in several programming languages, especially including C# professionally and but for example also Rust nowadays (and it is my favorite now), I can only say, that this modern type of Async code at the end of the video was obviously the solution I was thinking about immediately, even though I didn't exactly know the modern C++ implementation for async code. But this is how in modern programming this kind of thing is generally done. Many languages do very similar things. All these things are also a related to having programming experience here. If you have done enough concurrent and parallel programming, then it gradually becomes far more natural to think that way.
@Ozzymand
@Ozzymand 5 күн бұрын
never knew (nor did i think to check) if async and promises exist in c++ after using them in JS. Awesome
@valseedian
@valseedian 19 күн бұрын
haven't watched for even 1 second, but, the answer is a thread that sleeps for nearly 5m, then a few ms until the time is reached, then calls a callback or sets a flag. when I was making my scratch gui system in c++ I had to solve the timer issue so I wrote a whole scheduler and event handler subsystem.
@AndrewRedW
@AndrewRedW 10 күн бұрын
Inexperienced people writing funny code - my favourite form of entertainment :D
@hassanalmasri3935
@hassanalmasri3935 28 күн бұрын
Mr. Yan could you give us a homework to do for the next episode of the game engine series? Thanks for all your lovely content ❤❤❤
@HelloHigogo
@HelloHigogo 25 күн бұрын
13:56 forgive me if I'm wrong but the problem I see with the code here is that if the other process you run apart from the timer needs to finish every time before you check the time again you'll almost certainly not land on 5 minutes either. What if the process you run takes 10 minutes itself? Surely on an additional thread that example would be fine but in the code at 13:56 it would be 10 minutes before the timer would complete
@gniludio
@gniludio 28 күн бұрын
I had a nice time with this video.
@jonathancrawford7647
@jonathancrawford7647 28 күн бұрын
I've made a c++ scheduler class, it's kinda like your example and is reusable. basically it takes length of time and a pointer to a function. It uses async and I can schedule an action to happen on a timer later on. I have a timed game that uses it to call gameover() when the time is up. My test said "Hello World" a few times the "Goodbye World"
@ColossusEternum
@ColossusEternum 18 күн бұрын
Does the std lib have anything like the millis() function within the arduino IDE? I used to create non obstructive timers like this: Event to trigger timer sets variable = to millis() If(event) { Time = millis(); } If(currentTime-Time >= delayDuration){ Code to execute } Sorry if youre unfamiliar but millis() is a native function to arduino that counts up in milliseconds from the instant the MCU boots. The timing source is completely separate from the CPU and runs in the background and doesn't influence code execution(at least noticeably)
@calvinsomething5348
@calvinsomething5348 28 күн бұрын
A single-threaded task scheduler would be a cool video idea!
@sagarsabu
@sagarsabu 28 күн бұрын
Linux has some nice set of timers functionality via createtimer/ settimer / deletetimer. The timer delivery is via real time signals which can be a bit tricky to get right though.
@JkCxn
@JkCxn 28 күн бұрын
You can put your timer-finished code inside the if (status == ready) block or after the loop and then your timer class is responsible for fewer things
@Tuniwutzi
@Tuniwutzi 20 күн бұрын
It's interesting I never thought about how involved the simple question "how to delay code execution by X time" actually is. I usually work on stuff that is IO heavy and focuses on processing events as they come in (ie: a button was pressed, a socket received data, a cable was connected, ...). More often than not I already have an event loop, for example based on file handles and epoll/select. So my first instinct for a non-blocking timer was: create a timerfd and put it into the existing event loop. This video made me realize that I've never considered how many things become more straightforward if you're running a simulation that has one thread continuously running anyway.
@dawre3124
@dawre3124 28 күн бұрын
If you need to wait in performance critical multi threaded environment for an accurate amount of time as shortly mentioned in the video keep in mind sleep functions are not accurate (I would assume async can not fix this). with more threads that cpu cores the time sleep oversleeps tends to go up too. for full accuracy empty loops are the only way I know, for something reasonable reduce the sleep time with an empty loop afterwards. When I had problems with this I split the sleep into multiple calls (I felt like shorter sleeps are more accurate). I used something like this (C): void my_sleep_fast(const int64_t target_t) { int64_t time_diff; int64_t temp_sleep; time_diff = target_t - get_microseconds_time(); temp_sleep = time_diff - (time_diff >> 3); while (temp_sleep > SLEEP_TOLERANCE_FAST) { usleep(temp_sleep); time_diff = target_t - get_microseconds_time(); temp_sleep = time_diff - (time_diff >> 3); } usleep(SLEEP_TOLERANCE_FAST); }
@s3vster
@s3vster 26 күн бұрын
std::thread::sleep_for(std::chrono::minutes(5))
@DakkyW
@DakkyW 21 күн бұрын
Actually very curious about what you find as a good solution for function timing, been curious what low performance-impact options there are
@dr99tm23
@dr99tm23 28 күн бұрын
How applications with subscription set the free trial timer and even if you have no internet connection and change the time of your pc or shutdown for days, the program will still calculate the time correctly and end the free trial at the specific time 🤔?
@SimonVaIe
@SimonVaIe 28 күн бұрын
If your application can run offline and the user has sufficient permissions on their system, I don't think there's a reliable way to calculate real world time passing from your app. As you say, you can look at the system time, but that can be changed. You can then look at system logs for system time changes, but those can be altered. You can implement an always running background service that works even when system time is changed, but a service can be downed as well. Basically you have to trust data of a system you can't trust.
@ramiths8171
@ramiths8171 28 күн бұрын
Some applications don't even open without internet
@jacksonmagas9698
@jacksonmagas9698 28 күн бұрын
They just store the date time when you started the free trial and then when you run it it checks if the current date time is the trial period after the stored start date
@satibel
@satibel 11 күн бұрын
note that doing what you did with the system_clock or high_resolution_clock (in case it's not steady) instead of steady_clock can work most of the time, but you'll get issues when the time changes due to daylight savings or such, and you can accidentally get a one hour and 5 min timer
@delta3244
@delta3244 10 сағат бұрын
or a zero minute timer, for that matter
@minutesock9649
@minutesock9649 19 күн бұрын
What font are you usin in visual studio? It looks very nice.
@user-cp3hx6qy7w
@user-cp3hx6qy7w 17 сағат бұрын
That's a nice video! And what I like the most and that you seem to be one of the very few people I know, who actually use the steady_clock for timers and stopwatches, which is by the way the intended application of this tool. The vast majority resorts to high_resolution clock and then go around in panic when their system time gets updated. And man, is it a pain to search for a root of such a bug because it's really hard to reproduce it on your own machine and the behaviour just seems random. By the way, any implementation of sleep only guarantees that you sleep for at least a timespan or at least until the point in time. There is actually no upper limit on how much time would pass after that PS I guess the so-called expert wanted to do something similar to the main loop concept with a step of second instead of display frequency but just messed this up so badly that ended up with recursive calls. As for your point in the video, I saw a lot of samples of custom games where the time for actually running your game was just completely forgotten in your wait function at the end of the loop.
@lainiwakura3741
@lainiwakura3741 27 күн бұрын
Maybe I'm ignorant here, but I don't understand why anyone would use something like while(true) { if(time_condition) { break;} do_your_processing(); } Wouldn't while(time_condition) { do_your_processing(); } be strictly better? I guess there could be external conditions (like while the window of your game is open) but that was neither asked for nor shown in any example. So, is there any good reason to use while(true){...}?
@sebibence02
@sebibence02 10 күн бұрын
Timing in CS is an artform, basically an optimization between precision and CPU usage. The best approach is to go with the lowest level hardware interrupts and register a callback on the interrupt event. In higher level code the more precise timing you want, more frequently you need to schedule your timer thread which will lead to higher CPU usage. If you optimize to have lower CPU usage, the thread will be scheduled less often, therefore decreasing precision (the thread won't be able to check for elapsed time as frequently). Considering this the == approach in one of the replies is a huge mistake, because it is guaranteed that the timer never will be exactly equal due to the operating system's added thread scheduling overhead. Even with hardware interrupts there will be a thread swap operation losing some time until the instruction pointer is set to the callback method. Good stuff
@Evilanious
@Evilanious 28 күн бұрын
I think the questions I'd like to see answered here are not 'how to do it in c++', but rather, how does the computer clock work. How do you call it? How do you keep it counting while doing other stuff? The library I'll end up using isn't the most important. Though I guess if you need to solve this very specific problem it's time consuming to take that step back.
@lurgee1706
@lurgee1706 26 күн бұрын
sleep() is great untill you realize you can't cancel your timer and notify the user about it right away, so if you do need to handle cancellations (either manual or due to the process' shutdown), you're screwed. So: * If you want a delay in the current thread just use condition_variable::wait_for. * If you want it to be executed asynchronously, either spawn a thread yourself or spawn an std::async task (which may very well spawn a thread under the hood anyway) and, again, wait on a condvar. * If you want your solution to be generic and scalable, you're bound to end up with some kind of scheduler, so you either use a library like boost asio (whose timers do use a scheduler under the hood), or write one yourself. As "simple" as that. Frankly, seeing how easy it is to do the same thing in other languages like C#, coming back to C++ is just painful.
@DerHerrLatz
@DerHerrLatz 12 күн бұрын
Thank you for pointing out the obvious. (since nobody else does.) Would be nice to have an event- or mainloop in the standardlibrary. But it would probably not work if you don't have an OS to provide the underlying functionality.
@runforitman
@runforitman 17 күн бұрын
Interesting hearing your take Doing embedded C mainly I first think if i have a real time clock or not And would want to setup an interrupt on it to count up
@IQLion
@IQLion 23 күн бұрын
This reminded me of a similar problem in robotics. A lot of people get burned by using Sleep or something similar, because your robot stops getting sensor data while it waits.
@sledgex9
@sledgex9 28 күн бұрын
Nitpick: You could make the callback signature a template parameter so you can have type-safety at compile time.
@StefaNoneD
@StefaNoneD 19 күн бұрын
std::this_thread::sleep_for() does not use a monotic clock by default. That is, if you change your system time, it affects the timer (at least on Windows).
@JuniorDjjrMixMods
@JuniorDjjrMixMods 7 күн бұрын
I code more than a decade in gta3script (the proprietary script language that Rockstar Games uses from GTA 2 to GTA V, maybe GTA VI too), and is just this: SCRIPT_START { WHILE timera < 300000 WAIT 0 ENDWHILE PRINT_STRING_NOW "ok" 1000 } SCRIPT_END Or just WAIT 300000 but would be basically a Sleep. PRINT_STRING_NOW would be PRINT_NOW (for translation support), but I'm using the modding variant for this example. The "NOW" is high priority, doesn't matter. Another detail, old GTAs like GTA SA have a bug and need to set NOP or some other command in the start of the script before any WHILE. But I like how big game companies simplified this.
@tanja84dk1
@tanja84dk1 20 күн бұрын
Just curious does anyone have an idea of what the second argument to his TimerAsync is ? since unfortunately it were covered by his webcam and trying to recreate in to understand it better
@TheEdmaster87
@TheEdmaster87 27 күн бұрын
Timers are easy especially for hardware with different CPUs and MCUs. Some have even their own libraries for this, others you can setup a function to do this. It really depends what type of timer you need flr what. Most important thing is not to block other code that suppose to run in the "background" while the timer runs.
@alice20001
@alice20001 14 күн бұрын
1:16 THANK YOU!
@KeyYUV
@KeyYUV 17 күн бұрын
This really makes me appreciate the convenience of QTimer::singleShot(Duration msec, Functor &&functor). Implementing the event loop manually is such a pain.
@Omnifarious0
@Omnifarious0 12 күн бұрын
There is another case you didn't exactly mention. I've often designed my programs around event loops (I started writing programs before multiple cores were common). In that case, you need to have a timer expiry heap as part of your event loop so the loop can easily determine if you should just wait forever for an event, or wait until a specific time.
@imo098765
@imo098765 28 күн бұрын
Oddly enough, my first experience working with threads(Java) for work was fixing a timer for an api just checking if a remote service is alive Lets just say the person who implemented the timer never thought about how the thread would stop Logs had 10K lines waiting for check to be complete and said the service was down because it kept doing the check. It was supposed to stop after 10 tries
@stefanm578
@stefanm578 22 күн бұрын
wouldn't the "recursive" function be tail-call optimized, thus using constant stack memory?
@casdf7
@casdf7 9 күн бұрын
the while loop approach only works if you want to do something repeatedly. If you really want to do only one thing you need a thread obviously.
@lassdasi
@lassdasi 28 күн бұрын
What software do you use to draw on the screen?
@NavneetVermalivefree
@NavneetVermalivefree 26 күн бұрын
Great video.. You should go ahead and add your solution now on the post so that people can see it and understand how to write better code
@ender-gaming
@ender-gaming 16 күн бұрын
I don't code in C++, mostly do powershell scripting, but when I saw this I though of a simple while loop like your final solution with a running timer. Though I'm interested why you used 'While (true)' instead of 'while (satus == std::future_status::ready)'. I will say timing code is always an interesting challenge with far deep rabbit holes at least in the languages I've played with, usually in-built function have some noticeable overhead.
@kuhluhOG
@kuhluhOG 18 күн бұрын
15:20 Heavily depends on the OS scheduler. Some are more accurate than others (and some OS have multiple OS schedulers the user can choose from).
@LundBrandon
@LundBrandon 17 күн бұрын
I love embedded because there I have direct access to the cpu's timers/counters and interrupts ;)
@ahoe
@ahoe 28 күн бұрын
what app are you using to draw on the screen?
@RMDetho
@RMDetho 16 күн бұрын
I'm working on a web project that has a rhythm game demo feature. There's a lot of time sensitive information here, and I was really surprised how much execution time plays a role, maybe not in first 10 seconds, but after a minute and a half definitely. In the end I rewrote the whole portion and painstakingly added time corrections based on current time and the timestamp of when Play was pressed on all elements.. What I see here too is that in most cases, the result might be around the requested 5min, but there'd definitely be drift overtime in more time sensitive cases like mine.
@Drakaru
@Drakaru 27 күн бұрын
For just basic timing a function/scope I wrote a little class that wrapped chrono, takes a timestamp on construct and prints the diff on destruct. Good enough for dead basic use cases, not something I would use in a larger / more serious project though.
@Sluggernaut
@Sluggernaut 28 күн бұрын
Are you going to post this code onto that forum post with some explanation or link to this video? Why or why not? Edit: Nevermind. The forum post is locked. That's a great reason NOT to. You don't ever see the code at the end of the TimerAsync function. I THINK this is what it should be: std::future TimerAsync(std::chrono::duration duration, std::function callback) I'm not 100% sure but I have written the code exactly as TheCherno has it except I use "using namespace std;" as well because i'm a rebel. So apart from the portion that can't be seen, I have written the code exactly as it is and it appears (oh, and I named Period to TimePeriod) to run and work the same. So, fairly sure my guess is correct.
@thomasknapp7807
@thomasknapp7807 25 күн бұрын
Sluggernaut, Thanks for your suggestion on the missing code. As I am sure you know, your suggestion works by producing the same result that Cherno demonstrated when he set the timer to 5 seconds.
@Sluggernaut
@Sluggernaut 18 күн бұрын
@@thomasknapp7807 no idea
@Sluggernaut
@Sluggernaut 18 күн бұрын
​@@thomasknapp7807ok misunderstood your comment. Re-read it. Yes the code I suggested did work. Just wanted to lend some help, potentially, to anyone struggling to recreate this as I was
@debsarkar4893
@debsarkar4893 28 күн бұрын
What theme is he using in VS 2022 where can I get it?
@tsmspace
@tsmspace 28 күн бұрын
I have a different timer use-case I'm not sure the best way to overcome. My game is like a drone racing game (space drones though) and I really want a flight replay recorder. I have one ,, but its built in (unity c#) to the regular update function, which means that although there is a vsync target which I've set to once per vsync frame (so for my cheap tv monitor , it works well because the game runs at a constant 60fps) ,,, it is very possible for the replay to run at a different and even inconsistent speed than the actual gameplay. I've tried some different things to make the replay be recorded at a more constant rate ,, but nothing results in smooth replay frames. If anything other than the visible frame generation is replayed, the replay is jumpy. Some people say just record player inputs ,, but I can't imagine this going well for my situation, especially if the scene is pushing the players computer, because there is so much interpolation going on with the physics objects. The one time it would be most important, is where I have a spin-gravity drum that is interpolating to create spin-gravity for the player to interact with ,, and the replay can run slow,, but at this point the entire scene is interpolating which would unquestionably result in a replay that has the player somewhere different than the recorded flight. I thought maybe my recorded frame could include a timestamp somehow, and then check itself, but as a newb that is probably just a bit harder than I have set down to attempt, mostly because I can't imagine how it will NOT be just as jumpy as trying to do something like run the replay recorder in the fixed update. Doing a bit of research ,, flight recorders appear to be not that terribly common, probably for the same reason. It is extremely critical that the flight replays exactly (like, a drone race) , and smoothly ,, so the only thing that I can imagine that will go well,, is if the game is lite enough that the computer can reach a fixed frame target without fail, both during recording and replaying. ,,, but ,, unity uses vsync as the recommended way to fix frame targets on desktop pc and recommends against setting a frame target bc of varying hardware ,, so although that should be fair with a 60fps budget tv,, a gaming monitor probably will vary more in resulting framerate as it produces enough frames to potentially max out the cpu. In other words,, for the most part, the flight recorder works great on my end!!!
@Lexxaro
@Lexxaro 28 күн бұрын
Maybe you already mentioned this. But I would just save every object's transform (and possibly other state) for every frame that it changes with some relative time stamp. When replaying you can then just take the transforms and state for the current time, maybe interpolate them in some way, and just render them. This would make it completely deterministic and is pretty light on computation and memory.
@tsmspace
@tsmspace 27 күн бұрын
@@Lexxaro I tried using unity built in interpolation calls (the "move" ones) , but they are not smooth for some reason,, perhaps I did not apply them correctly. -- perhaps what I will do is try something like ,, have 3 player selectable options ,,, discard frames ,, attempt to interpolate between frames if needed ,, and raw frame by frame (default) ... The thing is ,, assuming their pc is able to achieve their default vsync rate for both record and playback,, it works fine, because the framerate remains constant. ... But ,, if this will NOT work out (for example when the game is interpolating a spin-drum which is when playback is slowed for me ) ,, they can select to either discard frames which gives them a choppy but time accurate replay,, and then the problem is for me so far it has NOT happened that the replay is FASTER than gameplay ,, so really interpolating wouldn't work out if the game is always just catching up though.
@harold2718
@harold2718 28 күн бұрын
TBH I really don't like all those "sleep"-based solutions, which (1) consume an entire thread just to have it do nothing, and (2) make the actual waited time depend on when the kernel decides to schedule the thread after the sleep runs out, depending on CPU load at the time etc. (at a scale of 5 minutes that's not very important, but still, it's a fundamentally inaccurate approach) To be fair to the people who suggested it, C++ doesn't really give us the tools to actually build a timer. (but windows does, so I guess we're back to #include after all)
@ashton7981
@ashton7981 28 күн бұрын
The waited time depending on the scheduling can be mitigated by using std::this_thread::sleep_until instead of std::this_thread::sleep_for. So instead of going off after the thread has been running for 5 min, it'll go off the first time it's scheduled after the 5 min mark.
@anon_y_mousse
@anon_y_mousse 28 күн бұрын
With a hosted environment, you can't depend on a timer to more than a few milliseconds of resolution anyway. This isn't an unhosted realtime OS that most people will be using this for. Also, there are better OS's than Windows that someone should be using if they don't enjoy having their data stolen and sometimes erroneously deleted by a piracy checking algorithm.
@sub-harmonik
@sub-harmonik 28 күн бұрын
if your timer is 5 minutes it shouldn't matter too much. It's when you get
@mike200017
@mike200017 8 күн бұрын
Coming from POSIX land, where anything interesting has a pollfd (file-descriptor) at the bottom of it, event loops consist of something that gathers all the interesting events and then calling "poll" on their pollfd's (or calling "epoll" or "select"). So, in that world, a timer like this is either implemented via a timerfd (you tell the kernel to create a "file" and trigger it at a specific time) or by simply setting the timeout for the poll call to the earliest wake-up time among your active timers (personally, I prefer that, gives more control). No messing around with threads. Coroutines are another way to do the same thing (coroutines are syntactic sugar on top of the same mechanisms).
@szirsp
@szirsp 14 күн бұрын
20:00 My use cases of timers usually involve programming the interrupt controller, setting up HW timers or RTC alarms in microcontrollers... setting up "sleep"/standby/poweroff states What different worlds we live in :)
@agostobloj
@agostobloj 27 күн бұрын
Can anybody share how will be the template code at line 10? I'm missing the lambda function declaration :( sorry for the rookiness :D
@coenraadloubser5768
@coenraadloubser5768 13 күн бұрын
I'm surprised they didn't redefine the halting problem and exclaimed: "We solved it! It will stop in 5 minutes!"
@liamlluls1588
@liamlluls1588 26 күн бұрын
I’m a c# noob, I would do a task.run and put a timer and my action to complete after the timer in a lambda function Is that acceptable ?
WHY did this C++ code FAIL?
38:10
The Cherno
Рет қаралды 168 М.
I made it FASTER // Code Review
38:46
The Cherno
Рет қаралды 523 М.
small vs big hoop #tiktok
00:12
Анастасия Тарасова
Рет қаралды 9 МЛН
World’s Deadliest Obstacle Course!
28:25
MrBeast
Рет қаралды 98 МЛН
ТАМАЕВ vs ВЕНГАЛБИ. ФИНАЛЬНАЯ ГОНКА! BMW M5 против CLS
47:36
the new PS4 jailbreak is sort of hilarious
12:21
Low Level Learning
Рет қаралды 584 М.
I Rewrote This Entire Main File // Code Review
16:08
The Cherno
Рет қаралды 128 М.
I Made a Neural Network with just Redstone!
17:23
mattbatwings
Рет қаралды 608 М.
Why Does Diffusion Work Better than Auto-Regression?
20:18
Algorithmic Simplicity
Рет қаралды 195 М.
C++ Super Optimization: 1000X Faster
15:33
Dave's Garage
Рет қаралды 300 М.
Minecraft Clone in C++ // Code Review
40:29
The Cherno
Рет қаралды 323 М.
10 weird algorithms
9:06
Fireship
Рет қаралды 1,1 МЛН
What Makes A Great Developer
27:12
ThePrimeTime
Рет қаралды 142 М.
I Made a Table Soccer Robot, and it's Better Than You Are
14:34
From Scratch
Рет қаралды 387 М.