A concurrency model (simulated or not) would make sense if you had multiple tasks that you need to run at the same time. In this case it appears you only have one task to run.
If the only requirement that you have is that your calculations stop at 12:00 and restart at 12:30 then all you need is to make sure your calculations can be divided into small steps, so that you have a chance to check the conditions for starting and stopping in between steps. Here is some pseudo-code:
while (true) {
current_time = get_current_time();
if (current_time >= 12:00 and current_time < 12:30)
sleep(12:30 - current_time);
else
perform_calculation_step();
}
If the starting and stopping conditions are more complex than what you indicated in your example you could abstract the start/stop logic into a separate function. Example:
while (true) {
wait_if_necessary(); // this blocks when the app is not allowed to run
perform_calculation_step()
}
I hope this helps!