Notes |
|
(0012157)
|
Garl
|
21-07-2013 13:23
|
|
такое поведение замечено не только на беркли
при сдвиге карт ыопределяется что надо скачать 32 тайла, затем сдвигам обратно (там где надо скачать 2-3 тайа) и бац! осталось скачать 0 тайлов!!!
хотя 2-3 так и осталиь не скачаными... |
|
|
|
Нужно воспроизвести в дебажной версии. Сейчас там должны перехватываться ексепшены в фоновых потоках. |
|
|
|
Кажись у меня самого воспроизвелось. |
|
|
|
Итог изысканий: нужно или добавлять в листенеры синхронизазаторы, чтобы избежать вызова полсле того как владелец начал удаляться, или по возможности избегать ситуаций, когда удаляется владелец листенера, сейчас это происходит при пересоздании IBitmapProvider-ов, которое чаще всего происходит при обновлении векторных тайлов. Второй вариант мне нравится больше, тем более что он совпадает с моими планами, но и первым придется скорее всего воспользоваться. |
|
|
|
Может быть по первому варианту тебе даже удастся сделать один легковесный объект типа
TCancellableOperation = record
private
FOperationID: Integer;
FCancelNotifier: INotifierOperation;
strict private
function GetIsCancelled: Boolean;
public
property IsCancelled: Boolean read GetIsCancelled;
end;
или аналогичный интерфейсный объект, чтобы его одного передавать как const вместо пары
const AOperationID: Integer;
const ACancelNotifier: INotifierOperation;
?
Смысл в том, чтобы передавать всё для отбоя в рамках одной сущности, и чтобы она же проверяла сама себя внутри IsCancelled на кончину, без ненужного вытаскивания наружу OperationID и CancelNotifier.
А возможно и байт как флаг смерти владельца туда можно будет всунуть. |
|
|
|
Не, я такого делать не хочу. Пару
const AOperationID: Integer;
const ACancelNotifier: INotifierOperation;
можно передать в любую dll на любом языке без проблем, а тот рекорд, который предлагаешь ты чисто делфовая структура, а интерфейсный объект ИМХО не стоит создавать каждый раз, но вообще уже есть такая вещь называется INotifierOneOperation. |
|
|
|
>можно передать в любую dll на любом языке без проблем
Если честно - не вижу принципиальных отличий в передаче. Там SizeOf как у обычного record-а, все эти IsCancelled вообще никуда не упираются. При передаче только как const вообще никаких проблем не прогнозируется.
>вообще уже есть такая вещь называется INotifierOneOperation
А почему тогда он в тех же экспортах не используется, ведь экспорт всегда как одна операция прерывается? |
|
|
|
>>можно передать в любую dll на любом языке без проблем
>Если честно - не вижу принципиальных отличий в передаче. Там SizeOf как у обычного record-а, все эти IsCancelled вообще никуда не упираются. При передаче только как const вообще никаких проблем не прогнозируется.
Может быть, но мне лень переделывать.
>А почему тогда он в тех же экспортах не используется, ведь экспорт всегда как одна операция прерывается?
Потому что позже появилось. Да и даунлодер и тп. расчитаны именно на пару AOperationID, ACancelNotifier. |
|
|
|
PS: В данном инциденте это полный оффтопик ибо никакого отношения к проблеме не имеет. |
|