UniSoft
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: ***.onpaintevent, когда очередной кадр готов, который в свою очередь в событии ***.onpaintevent обрабатываю я. Так вот, нажатия клавиш в OnFormKeyUp и других приводят к тому, что клавишное событие может приключиться именно посередине ***.onpaintevent, то есть во время рисования. А мне в клавишных событиях надо открывать очередной файл, либо делать вещи опять таки связанные с рисованием... Как тут быть? Как можно дождаться окончания ***.onpaintevent в любом другом событии, чтобы продолжить работу? | может просто обернуть все функции, которые не должны пересекаться в TCriticalSection? тогда один поток просто приостановится, пока другой не освободит секцию. (по крайней мере это лучше (и правильнее), чем sleep(20)) Цитата: учитывая что у меня в среднем самый жирный кадр рисуется менее 10мс, в среднем видео 4k 3-7мс, то этого хватает, чтобы ивент рисования завершился | А на каком-нибудь ПК древнем, как мамонт, эти 10мс могут несколькоооооооооо затянуться... Код: TMyClass = class private FCs: TCriticalSection; //... end; constructor TMyClass.Create; begin inherited; FCs := TCriticalSection.Create; end; destructor TMyClass.Destroy; begin FCs.Free; inherited; end; // ну и обернуть функции в FCs.Acquire; { lock out other threads } try // do job finally FCs.Release; end; | И есть еще аналог... System.TMonitor (похоже просто своя реализация той же CriticalSection) Код: FThreadLock: TObject; { constructor } FThreadLock := TObject.Create; { destructor } FThreadLock.Free; TMonitor.Enter(FThreadLock); try // do job finally TMonitor.Exit(FThreadLock); end; |
| Всего записей: 649 | Зарегистр. 22-12-2006 | Отправлено: 11:50 07-08-2015 | Исправлено: UniSoft, 12:34 07-08-2015 |
|