Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Исключение в TMonitor.Wait  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
Всем доброго дня.
Пишу TMonitor.Wait, иногда валится с исключением EMonitorLockException Object lock not owned. Падает по понятным причинам. У инстанса класса не всегда был выполнен 'вход' TMonitor.Enter. Пока что просто 'отключил' исключение EMonitorLockException с помощью try except.
Вопрос: можно и нужно ли с этим что-то делать?
28 ноя 17, 19:46    [20989403]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
schi
Member

Откуда: Москва
Сообщений: 2353
Дико извиняюсь, но напоминает анекдот про беспокоящий Гондурас.
То есть, возникает исключение, потому что не был выполнен вызов, и на вопрос "что с этим делать" ответ вроде однозначный: выполнить вызов.
Или я чего-то не понял ?
29 ноя 17, 12:05    [20991257]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
schi,

Вызов TMonitor.Enter не всегда необходим. А TMonitor.Wait нужно вызывать всегда (в деструкторе класса). Я заранее не знаю, вызывался ли TMonitor.Enter или нет. Нужно либо ставить дополнительный флаг, чего не хотелось бы. Либо возможно как-то это можно сделать самим TMonitor'ом. Пока что лучшего пути, чем покрешить TMonitor и словить исключение, не нашел. В общем-то, вроде бы нормально работает.
29 ноя 17, 12:21    [20991325]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
schi
Member

Откуда: Москва
Сообщений: 2353
if not TryEnter then Wait ?
29 ноя 17, 12:58    [20991533]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
fd00ch
Member

Откуда: Нижний Новгород
Сообщений: 5864
schi, падать будет гораздо реже, но зависать - чаще
29 ноя 17, 13:03    [20991563]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
fd00ch,

что-то мне тоже так кажется ) зависания, понятно, абсолютно недопустимы.

Глобально, стоит задача дождаться конца 'занятости' инстанса и его разрушить. Инстанс обычного класса. Может быть 'занят' как основным потоком, так и дополнительными. TMonitor, вроде бы, справляется. Была критическая секция, работало хуже. Код не мой. Я бы, возможно, вообще по-другому сделал. Но не хочу всё переписывать.
29 ноя 17, 13:19    [20991642]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
fd00ch
Member

Откуда: Нижний Новгород
Сообщений: 5864
makhaon
Вопрос: можно и нужно ли с этим что-то делать?
по логике - нет, ведь метода TryWait не существует, а ошибки, которые могут возникать при синхронизации, надо обрабатывать. раз TMonitor генерит исключения - юзаешь блок try/except, при критических секциях у WaitForSinglObject тоже ведь надо проверять коды возврата - никто не говорит, что это говнокод))
29 ноя 17, 13:26    [20991685]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
А проводил кто-то тесты TMonitor и критической секции. Есть подозрение, что крит секция может работать быстрее
29 ноя 17, 17:41    [20993147]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
vavan
Member

Откуда: Казань
Сообщений: 2908
SOFT FOR YOU
проводил кто-то тесты TMonitor и критической секции. Есть подозрение, что крит секция может работать быстрее
https://www.delphitools.info/2013/06/06/tmonitor-vs-trtlcriticalsection/
http://blog.therealoracleatdelphi.com/2013/08/monitoring-monitor_23.html
29 ноя 17, 18:03    [20993231]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1617
SOFT FOR YOU
А проводил кто-то тесты TMonitor и критической секции. Есть подозрение, что крит секция может работать быстрее
Насколько помню в XE5 или его апдейте пофиксили быстродействие TMonitor - теперь он вровень или быстрее
29 ноя 17, 18:35    [20993306]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
vavan,

Крит секция в 13 раз быстрее? )
29 ноя 17, 18:35    [20993307]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
fd00ch
Member

Откуда: Нижний Новгород
Сообщений: 5864
white_nigger, разве, не просто баг там пофиксили?
29 ноя 17, 18:44    [20993332]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1617
fd00ch
white_nigger, разве, не просто баг там пофиксили?
Что именно ты хочешь понять?
29 ноя 17, 20:50    [20993576]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2420
А чего тогда TMonitor не реализовали поверх критической секции? )
30 ноя 17, 20:00    [20996487]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 183
makhaon
schi,

Вызов TMonitor.Enter не всегда необходим. А TMonitor.Wait нужно вызывать всегда (в деструкторе класса). Я заранее не знаю, вызывался ли TMonitor.Enter или нет. Нужно либо ставить дополнительный флаг, чего не хотелось бы. Либо возможно как-то это можно сделать самим TMonitor'ом. Пока что лучшего пути, чем покрешить TMonitor и словить исключение, не нашел. В общем-то, вроде бы нормально работает.
Следующая задача видимо будет такая - не работает FreeMem, который всегда должен вызываться в деструкторе класса. При этом GetMem не всегда необходим, поэтому и не вызывается. Как решить проблему падения освобождения памяти, потому что использовать всякие там флаги не хочется из за (вставить отмазку)?
30 ноя 17, 20:07    [20996494]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2676
SOFT FOR YOU
А чего тогда TMonitor не реализовали поверх критической секции? )

Для кого ссылки-то давали:
With just that one simple change, TMonitor is matching and even sometimes now exceeding the performance of the Windows critical section. On the whole, I’d declare them equivalent. This does, however, mean you will need to explicitly set the spin count on the TMonitor to some value. Normally the “right” value is a guess based on empirical testing for your specific use case. I suspect the Windows critical section code selects some value based on the number of cores and CPU speed. At some point, I'll need to research an algorithm that can automatically select a reasonable spin count.

There is one thing I can say that TMonitor has over the Windows critical section… it works on all platforms (Windows, MacOS, iOS, and soon Android). Feel free to use whichever one you feel more comfortable using for your specific situation. Me? I will fully admit I’m biased…
30 ноя 17, 20:10    [20996500]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
schi
Member

Откуда: Москва
Сообщений: 2353
asutp2
Следующая задача видимо будет такая - не работает FreeMem, который всегда должен вызываться в деструкторе класса. При этом GetMem не всегда необходим, поэтому и не вызывается. Как решить проблему падения освобождения памяти, потому что использовать всякие там флаги не хочется из за (вставить отмазку)?


Да, близко к этому
1 дек 17, 10:40    [20997560]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
asutp2,

будут какие-то конкретные проблемы? или так чисто - абы языком ляпнуть?
1 дек 17, 14:42    [20998506]     Ответить | Цитировать Сообщить модератору
 Re: Исключение в TMonitor.Wait  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
schi,

Петросян, перелогинься
1 дек 17, 15:20    [20998684]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить