С недавних пор (студия 10.2.2) программа начала падать в System.Classes в function CheckSynchronize. Конкретно кусок
try
if Assigned(SyncProc.SyncRec.FMethod) then
SyncProc.SyncRec.FMethod()
else if Assigned(SyncProc.SyncRec.FProcedure) then
SyncProc.SyncRec.FProcedure();
except
if not SyncProc.Queued then
SyncProc.SyncRec.FSynchronizeException := AcquireExceptionObject
else if Assigned(ApplicationHandleException) then
ApplicationHandleException(SyncProc.SyncRec.FThread);
end;
И далее. Дело в том, что в SyncProc.SyncRec или nil или мусор. Ни в стеке вызовов, ни в других нитках я намёков на причину не нашёл. В стеке вызов CallNextHookEx, который дёргает StdWndProc, а та пытается синхронизироваться. Последний ассерт происходит из-за Error(reMonitorNotLocked) в
function TMonitor.CheckOwningThread: TThreadID;
и далее программа или работает нормально, или повисает UI намертво - когда как. Подозреваю, что пытается синхронизироваться объект, которого уже нет. У меня все формы и все компоненты на них создаются и удаляются динамически. Таблицы заполняются в других потоках через Synchronize и т.д В общем проект большой, и что иголку в стоге сена искать... Глюк плавающий, но проявляется наиболее стабильно после закрытия определённого окна.
Создаю компоненты стандартно. Типа:
control := TEdit.Create(parent);
и удаляю тоже
if assigned(control) then FreeAndNil(control);
Форму создаю:
BaseForm := TEmtyForm_frm.Create(Application);
BaseForm.Name := 'Form'+IntToStr(Random(256)*Random(256));
if assigned(parentScRun) then
BaseForm.Parent := parentScRun.BaseForm;
удаляю соответственно:
if assigned(BaseForm) then FreeAndNil(BaseForm);
Посоветуйте куда "копать"? Может ли быть верна моя догадка, что это из-за уже разрушенного объекта? Если да - что надо синхронизировать перед FreeAndNil? Если нет - что ещё посмотреть?
Вопрос
Akad
С недавних пор (студия 10.2.2) программа начала падать в System.Classes в function CheckSynchronize. Конкретно кусок
try if Assigned(SyncProc.SyncRec.FMethod) then SyncProc.SyncRec.FMethod() else if Assigned(SyncProc.SyncRec.FProcedure) then SyncProc.SyncRec.FProcedure(); except if not SyncProc.Queued then SyncProc.SyncRec.FSynchronizeException := AcquireExceptionObject else if Assigned(ApplicationHandleException) then ApplicationHandleException(SyncProc.SyncRec.FThread); end;
И далее. Дело в том, что в SyncProc.SyncRec или nil или мусор. Ни в стеке вызовов, ни в других нитках я намёков на причину не нашёл. В стеке вызов CallNextHookEx, который дёргает StdWndProc, а та пытается синхронизироваться. Последний ассерт происходит из-за Error(reMonitorNotLocked) в
function TMonitor.CheckOwningThread: TThreadID;
и далее программа или работает нормально, или повисает UI намертво - когда как. Подозреваю, что пытается синхронизироваться объект, которого уже нет. У меня все формы и все компоненты на них создаются и удаляются динамически. Таблицы заполняются в других потоках через Synchronize и т.д В общем проект большой, и что иголку в стоге сена искать... Глюк плавающий, но проявляется наиболее стабильно после закрытия определённого окна.
Создаю компоненты стандартно. Типа:
control := TEdit.Create(parent);
и удаляю тоже
if assigned(control) then FreeAndNil(control);
Форму создаю:
BaseForm := TEmtyForm_frm.Create(Application);
BaseForm.Name := 'Form'+IntToStr(Random(256)*Random(256));
if assigned(parentScRun) then
BaseForm.Parent := parentScRun.BaseForm;
удаляю соответственно:
if assigned(BaseForm) then FreeAndNil(BaseForm);
Посоветуйте куда "копать"? Может ли быть верна моя догадка, что это из-за уже разрушенного объекта? Если да - что надо синхронизировать перед FreeAndNil? Если нет - что ещё посмотреть?
Изменено пользователем AkadСсылка на комментарий
11 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.