- Код: Выделить всё
iteration:
signal := false;
repeat until signal;
do_work;
goto iteration;
Смысл в том, чтобы держать поток, который будет делать работу асинхронно с основным потоком, для этого он должен ждать сигнала от первого потока, считывая постоянно переменную signal. Задержка критична.
Проблема даже не в том, что такой код сжирает 100% ядра выданого треду, это еще терпимо. Проблема в том, что задержка между изменением значения signal = true и началом do_work, отнють не моментальна. Такое ощущение что ЦП захлебывается в пустом цикле и очень долго выходит из него. Есть ли способы побороть проблему, или возможно есть механизм в Lazarus по типу критических секций, который умеет замораживать и размораживать потоки не на уровне логики, а на уровне ОС?