|
|
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня. Пишу TMonitor.Wait, иногда валится с исключением EMonitorLockException Object lock not owned. Падает по понятным причинам. У инстанса класса не всегда был выполнен 'вход' TMonitor.Enter. Пока что просто 'отключил' исключение EMonitorLockException с помощью try except. Вопрос: можно и нужно ли с этим что-то делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2017, 19:46:04 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
Дико извиняюсь, но напоминает анекдот про беспокоящий Гондурас. То есть, возникает исключение, потому что не был выполнен вызов, и на вопрос "что с этим делать" ответ вроде однозначный: выполнить вызов. Или я чего-то не понял ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 12:05:32 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
schi, Вызов TMonitor.Enter не всегда необходим. А TMonitor.Wait нужно вызывать всегда (в деструкторе класса). Я заранее не знаю, вызывался ли TMonitor.Enter или нет. Нужно либо ставить дополнительный флаг, чего не хотелось бы. Либо возможно как-то это можно сделать самим TMonitor'ом. Пока что лучшего пути, чем покрешить TMonitor и словить исключение, не нашел. В общем-то, вроде бы нормально работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 12:21:28 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
if not TryEnter then Wait ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 12:58:21 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
schi, падать будет гораздо реже, но зависать - чаще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 13:03:25 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
fd00ch, что-то мне тоже так кажется ) зависания, понятно, абсолютно недопустимы. Глобально, стоит задача дождаться конца 'занятости' инстанса и его разрушить. Инстанс обычного класса. Может быть 'занят' как основным потоком, так и дополнительными. TMonitor, вроде бы, справляется. Была критическая секция, работало хуже. Код не мой. Я бы, возможно, вообще по-другому сделал. Но не хочу всё переписывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 13:19:38 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
makhaonВопрос: можно и нужно ли с этим что-то делать?по логике - нет, ведь метода TryWait не существует, а ошибки, которые могут возникать при синхронизации, надо обрабатывать. раз TMonitor генерит исключения - юзаешь блок try/except, при критических секциях у WaitForSinglObject тоже ведь надо проверять коды возврата - никто не говорит, что это говнокод)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 13:26:14 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
А проводил кто-то тесты TMonitor и критической секции. Есть подозрение, что крит секция может работать быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 17:41:54 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
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.11.2017, 18:03:56 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUА проводил кто-то тесты TMonitor и критической секции. Есть подозрение, что крит секция может работать быстрееНасколько помню в XE5 или его апдейте пофиксили быстродействие TMonitor - теперь он вровень или быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 18:35:44 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
vavan, Крит секция в 13 раз быстрее? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 18:35:50 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
white_nigger, разве, не просто баг там пофиксили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 18:44:31 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
fd00chwhite_nigger, разве, не просто баг там пофиксили?Что именно ты хочешь понять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2017, 20:50:25 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
А чего тогда TMonitor не реализовали поверх критической секции? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2017, 20:00:22 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
makhaonschi, Вызов TMonitor.Enter не всегда необходим. А TMonitor.Wait нужно вызывать всегда (в деструкторе класса). Я заранее не знаю, вызывался ли TMonitor.Enter или нет. Нужно либо ставить дополнительный флаг, чего не хотелось бы. Либо возможно как-то это можно сделать самим TMonitor'ом. Пока что лучшего пути, чем покрешить TMonitor и словить исключение, не нашел. В общем-то, вроде бы нормально работает.Следующая задача видимо будет такая - не работает FreeMem, который всегда должен вызываться в деструкторе класса. При этом GetMem не всегда необходим, поэтому и не вызывается. Как решить проблему падения освобождения памяти, потому что использовать всякие там флаги не хочется из за (вставить отмазку)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2017, 20:07:12 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
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.11.2017, 20:10:20 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
asutp2Следующая задача видимо будет такая - не работает FreeMem, который всегда должен вызываться в деструкторе класса. При этом GetMem не всегда необходим, поэтому и не вызывается. Как решить проблему падения освобождения памяти, потому что использовать всякие там флаги не хочется из за (вставить отмазку)? Да, близко к этому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2017, 10:40:34 |
|
||
|
Исключение в TMonitor.Wait
|
|||
|---|---|---|---|
|
#18+
asutp2, будут какие-то конкретные проблемы? или так чисто - абы языком ляпнуть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2017, 14:42:53 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39561219&tid=2041491]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
81ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 457ms |

| 0 / 0 |
