View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0003158SAS.Планета[All Projects] Багpublic06-12-2016 01:0623-10-2017 20:05
ReporterGromov 
Assigned Tovdemidov 
PrioritynormalSeverityblockReproducibilityalways
StatusresolvedResolutionfixed 
PlatformOSWindowsOS Version10, 64-bit
Product Version160707 
Target Version181221Fixed in Version181221 
Summary0003158: Зависание при изменении масштаба с 9 на 10 или с 10 на 9 при разрешении 3840х2160
DescriptionПрограмма зависает, если в системе выставлено разрешение 3840х2160, в свойствах приложения в Windows во вкладке "Совместимость" стоит галочка "Отключить масштабирование изображения при высоком разрешении" и масштаб карты в программе меняется с 9-го на 10-й или наоборот. В случае, если не включать эту опцию, изображение выглядит размытым.
Steps To Reproduce1. Установить или распаковать программу
2. Выбрать исполняемый файл и в контекстном меню выбрать пункт "Свойства"
3. Во вкладке "Совместимость" поставить галочку "Отключить масштабирование изображения при высоком разрешении"
4. Приблизить карту до масштаба 9, попробовать перейти к масштабу 10 - программа зависает, отображая карту масштаба 9.
TagsNo tags attached.
Attached Files? file icon SASPlanet.Debug.elf [^] (92,484 bytes) 06-12-2016 23:37
? file icon 2017.01.23_SASPlanet.Debug.elf [^] (91,154 bytes) 26-01-2017 22:34

- Relationships
has duplicate 0003291closedzed Locking up 

-  Notes
(0017712)
zed (manager)
06-12-2016 12:12

Интерфейс зависает полностью или только карта? На других зумах проблем нет? Запустите дебажную версию и после зависания подождите минуту, до появления сообщения об ошибке.
(0017713)
Gromov (reporter)
06-12-2016 12:30

Интерфейс зависает полностью, остается только принудительно снимать задачу. Где можно скачать дебажную версию, я попробую получить сообщение об ошибке.
(0017714)
zed (manager)
06-12-2016 12:32

Идёт в составе ночной сборки (SASPlanet.Debug.exe), отчёт об ошибке (файл с расширением *.elf) появляется в папке с программой.
(0017716)
Gromov (reporter)
06-12-2016 23:39

Запустил дебажную версию, отчет об ошибке загрузил.
(0017717)
zed (manager)
07-12-2016 06:19

Почему-то случается дедлок в TViewPortState.ChangeViewSize - во время смены зума с анимацией срабатывает событие TfrmMain.mapResize, которое вызывает этот метод и пытается захватить блокировку, в то время как TViewPortState.ChangeZoomWithFreezeAtVisualPointWithScale ещё не отработала и не освободила блокировку.

Gromov
Отключите опцию "Вид - Анимация при масштабировании", должно помочь, пока с дедлоком не разберёмся.
(0017718)
Gromov (reporter)
07-12-2016 07:30

Действительно, помогло. Спасибо!
(0017782)
Gromov (reporter)
23-01-2017 01:13

Теперь, на версии 170113.9655 - даже при отключении опции "Вид - Анимация при масштабировании" происходит зависание.
(0017783)
zed (manager)
23-01-2017 05:50

Сделайте отчёт об ошибке, как в прошлый раз.

И уточните, баг только на зумах 9 <-> 10?
(0017784)
Gromov (reporter)
26-01-2017 22:34

Приложил отчет об ошибке, баг только на зумах 9 <-> 10.
(0017785)
vdemidov (manager)
27-01-2017 07:25

Я, кажется, понял в чем проблема. Классический дедлок связанный с рекурсивным вызовом примитива синхронизации не поддерживающего рекурсивных вызовов. Да еще и при редком стечении обстоятельств. Проблема в TViewPortState. В том что у него есть и блокировка FCS, и FView со своим вызовом уведомлений подписчиков под этой блокировкой.

Как всегда исправить можно кучей разных способов:

Можно сделать FCS поддерживающим рекурсивные вызовы. Это несколько смягчит, но, как мне кажется, не исправит проблему полностью, потому что в свое время я не рассчитывал TViewPortState на повторные вхождения и может вылезти что-то еще. А может и не вылезти.

Можно вынести изменение FView из под блокировки. Но тогда может возникнуть хитрая ситуация гонки, если два потока вызвали изменение TViewPortState и действия одного из них просто потерялись, потому что он пользовался еще не обновленным значением FView.

Можно поковырять ILocalCoordConverterChangeableInternal и сделать, что бы обязанностью вызывать нотификаторы подписчиков было у изменяющего. То есть SetConverter изменяет значение, но не дергает нотификаторы, а только возвращает bool указывающий на необходимость этого, а уже TViewPortState дергает добавленный метод DoNotify после освобождения блокировки.
(0017786)
vdemidov (manager)
27-01-2017 07:29
edited on: 27-01-2017 07:39

А еще можно сделать TViewPortState наследником TLocalCoordConverterChangeable и вообще избавиться от лишней блокировки FCS.

ИМХО так будет даже правильнее, хотя я обычно предпочитаю аггрегацию наследованию.

PS: разделение этих сущностей в разные объекты было сделано очень давно и с тех пор многое изменилось. Теперь такое разделение выглядит совсем неоправданным.

(0017788)
zed (manager)
28-01-2017 16:01

vdemidov
Займёшься?
(0017789)
vdemidov (manager)
28-01-2017 16:58

Через 10 минут залью
(0017790)
vdemidov (manager)
28-01-2017 17:01

Вроде бы исправил причину дедлока. Проверяйте в следующей ночнушке.
(0017791)
Gromov (reporter)
30-01-2017 01:10

Проверил, версия SAS.Planet.Nightly.170128.9656 - все работает даже с анимацией.

- Users who viewed this issue
User List Anonymous (2293x), zaresefat (1x), rass (1x), Aveveritas (1x), Cajun520 (2x), -off- (1x), Gromov (22x), bk99 (5x), vdemidov (30x), Garl (4x), zed (14x), NK0 (1x), [email protected] (1x), netsky (1x), VMatveev (1x), gma (1x)
Total Views 2379
Last View 09-08-2020 02:57

- Issue History
Date Modified Username Field Change
06-12-2016 01:06 Gromov New Issue
06-12-2016 12:08 zed Project Домен, сайт, форум, багтрекер => SAS.Планета
06-12-2016 12:12 zed Note Added: 0017712
06-12-2016 12:12 zed Status new => feedback
06-12-2016 12:30 Gromov Note Added: 0017713
06-12-2016 12:30 Gromov Status feedback => new
06-12-2016 12:32 zed Note Added: 0017714
06-12-2016 23:37 Gromov File Added: SASPlanet.Debug.elf
06-12-2016 23:39 Gromov Note Added: 0017716
07-12-2016 06:19 zed Note Added: 0017717
07-12-2016 07:30 Gromov Note Added: 0017718
23-01-2017 01:13 Gromov Note Added: 0017782
23-01-2017 05:50 zed Note Added: 0017783
26-01-2017 22:34 Gromov File Added: 2017.01.23_SASPlanet.Debug.elf
26-01-2017 22:34 Gromov Note Added: 0017784
27-01-2017 07:25 vdemidov Note Added: 0017785
27-01-2017 07:29 vdemidov Note Added: 0017786
27-01-2017 07:39 vdemidov Note Edited: 0017786 View Revisions
28-01-2017 16:01 zed Note Added: 0017788
28-01-2017 16:03 zed Status new => confirmed
28-01-2017 16:03 zed Product Version => 160707
28-01-2017 16:03 zed Target Version => 25xxxx
28-01-2017 16:03 zed Summary зависание при изменении масштаба с 9 на 10 или с 10 на 9 при разрешении 3840х2160 => Зависание при изменении масштаба с 9 на 10 или с 10 на 9 при разрешении 3840х2160
28-01-2017 16:58 vdemidov Note Added: 0017789
28-01-2017 16:58 vdemidov Assigned To => vdemidov
28-01-2017 16:58 vdemidov Status confirmed => assigned
28-01-2017 17:01 vdemidov Note Added: 0017790
28-01-2017 17:01 vdemidov Assigned To vdemidov =>
28-01-2017 17:01 vdemidov Status assigned => feedback
30-01-2017 01:10 Gromov Note Added: 0017791
30-01-2017 01:10 Gromov Status feedback => new
30-01-2017 08:22 vdemidov Status new => resolved
30-01-2017 08:22 vdemidov Fixed in Version => 181221
30-01-2017 08:22 vdemidov Resolution open => fixed
30-01-2017 08:22 vdemidov Assigned To => vdemidov
30-01-2017 08:23 vdemidov Target Version 25xxxx => 181221
23-10-2017 20:05 zed Relationship added has duplicate 0003291



Copyright © 2007 - 2020 SAS.Planet Team