powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
25 сообщений из 135, страница 4 из 6
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895052
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)

Тут больше дело в проблемах возникающих в таком коде при сопровождении, человек примет это как данность, а не угрозу - размножит этот подход (а чёп нет, просто же?), код даже из этого примера легко разрастётся, могут проявиться другие исключения. Из-за такого вот упрощения поиск ошибки в коде может занять очень длительное время.
Всегда лучше чётко описать конкретные исключения, отправив неизвестное гулять дальше - это не такая большая проблема.

PS: если подцепить обработчик крашей вроде EurekaLog или Madshi, то сопровождение приложения заметно улучшится

Это всё верно, но в данном случае - из пушки по воробьям. Вроде того Hello world MVC с листингом на три экрана. Но согласен, что такие допущения должны вноситься осознанно.

Barmaley57
kealon(Ruslan)
try ... finally/except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86)
ЕМНИП, тормоза будут только в случае исключительных ситуаций.

Нет, замерил специально, try секции замедляют почти в три раза.
Ops/sec: 1716247 / 612494. Правда, значимой задержка начинает быть при кол-ве итераций от 150 млн.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895054
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
del, дубль
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895182
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Barmaley57
пропущено...
ЕМНИП, тормоза будут только в случае исключительных ситуаций.

Нет, замерил специально, try секции замедляют почти в три раза.
Ops/sec: 1716247 / 612494. Правда, значимой задержка начинает быть при кол-ве итераций от 150 млн.


В x86 обработка исключений никак не регулируется стандартом. для try-секции компилятор создаёт допкод, который записывает в стек инфу для восстановления - естественно это будет замедлять основной код

В x64 допкод не создаётся, компилятор только добавляется раскрутку в блок данных программы, соответственно и try-блок не добавляет кода и не замедляет выполнение. Но это сильно затрудняет анализ, отсюда и обработка исключения в случае его появления будет медленее, чем на x86.

Например, в питоне, особенно активно используются исключения для различных ветвлений, это давало довольно сильные тормоза для x64-билда.

PS: всё вышесказанное относится к компиляции под винду
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895188
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
alekcvp,
по вашему посту подчёркнуто "Главное" - Не Главное, эксепшены группируются в список, это вполне нормальная ситуация для анализа ошибки - тынц

Ага, цитата по вашей же ссылке:по-умолчанию, вложенные исключения не запоминаются. Чтобы сохранить вложенное исключение, вам нужно возбудить его через Exception.RaiseOuterException (стиль Delphi) или Exception.ThrowOuterException (стиль C++ Builder). Это как с трассировкой стека: они сделали возможность , но если вам это надо, то реализацию пишите сами, ручками. Т.е. очевидно что по-умолчанию там ничего хорошего не получится. И кроме того, мы говорили о потоках , а в потоках за пределы Execute() никакие исключения выходить не должны, да?..
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895198
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Это как с трассировкой стека: они сделали возможность , но если вам это надо, то реализацию пишите сами, ручками. Т.е. очевидно что по-умолчанию там ничего хорошего не получится. И кроме того, мы говорили о потоках , а в потоках за пределы Execute() никакие исключения выходить не должны, да?..
зачем тогда для потока делать объект-исключение?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895200
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
в потоках за пределы Execute() никакие исключения выходить не должны, да?..
Не обязательно
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
function ThreadProc(Thread: TThread): Integer;
var
  FreeThread: Boolean;
begin
  TThread.FCurrentThread := Thread;
{$IF Defined(MACOS)}
  if Thread.FSuspended then
    pthread_mutex_lock(Thread.FCreateSuspendedMutex);
{$ELSEIF Defined(LINUX)}
  if Thread.FSuspended then
    sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF LINUX}
  try
    if not Thread.Terminated then
    try
      Thread.Execute;
    except
      Thread.FFatalException := AcquireExceptionObject;
    end;
  finally
    Result := Thread.FReturnValue;
    FreeThread := Thread.FFreeOnTerminate;
    Thread.DoTerminate;
    Thread.FFinished := True;
    SignalSyncEvent;
    if FreeThread then Thread.Free;
{$IF Defined(MSWINDOWS)}
    EndThread(Result);
{$ELSEIF Defined(POSIX)}
    // Directly call pthread_exit since EndThread will detach the thread causing
    // the pthread_join in TThread.WaitFor to fail.  Also, make sure the EndThreadProc
    // is called just like EndThread would do. EndThreadProc should not return
    // and call pthread_exit itself.
    if Assigned(EndThreadProc) then
      EndThreadProc(Result);
    pthread_exit(Result);
{$ENDIF POSIX}
  end;
end;

...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895227
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
alekcvp
в потоках за пределы Execute() никакие исключения выходить не должны, да?..
Не обязательно
Это всё красиво в коде, но когда доходит до дела, то в рандомных местах случается AV. Особенно если исключение "выпустить" где-нибудь в OnThreadFinished. Пытался разобраться, но дошёл до того что он это исключение пытается перенести через Synchronize из вторичного потока в главный и где-то что-то у него идёт не так как задумано. В итоге пришёл к тому, что если не хочешь проблем - исключения не должны покидать методы и события потока.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895235
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,
да, у них там косяк
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
function ThreadProc(Thread: TThread): Integer;
var
  FreeThread: Boolean;
begin
  TThread.FCurrentThread := Thread;
{$IF Defined(MACOS)}
  if Thread.FSuspended then
    pthread_mutex_lock(Thread.FCreateSuspendedMutex);
{$ELSEIF Defined(LINUX)}
  if Thread.FSuspended then
    sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF LINUX}
  try
    if not Thread.Terminated then
    try
      Thread.Execute;
    except
      Thread.FFatalException := AcquireExceptionObject;
    end;
  finally
    Result := Thread.FReturnValue;
    FreeThread := Thread.FFreeOnTerminate;
    Thread.DoTerminate;
    Thread.FFinished := True;
    SignalSyncEvent;
    if FreeThread then Thread.Free;
{$IF Defined(MSWINDOWS)}
    EndThread(Result);
{$ELSEIF Defined(POSIX)}
    // Directly call pthread_exit since EndThread will detach the thread causing
    // the pthread_join in TThread.WaitFor to fail.  Also, make sure the EndThreadProc
    // is called just like EndThread would do. EndThreadProc should not return
    // and call pthread_exit itself.
    if Assigned(EndThreadProc) then
      EndThreadProc(Result);
    pthread_exit(Result);
{$ENDIF POSIX}
  end;
end;

и в этом обработчике исключение нельзя выпускать
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895272
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
alekcvp,
да, у них там косяк
и в этом обработчике исключение нельзя выпускать

Сегодня нельзя в этом, завтра нельзя в другом, мораль: не хочешь проблем - не выпускай ни в каком :)
Там в самом DoTerminate, вроде, ещё какая-то обработка исключений есть. Исходников просто сейчас нет под рукой.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895390
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

нету там ничего для защиты
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TThread.DoTerminate;
begin
  if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;
...
procedure TThread.CallOnTerminate;
begin
  if Assigned(FOnTerminate) then FOnTerminate(Self);
end;
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895579
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич

Thread.FreeOnTerminate:=True; - тоже не делает поток nil.

FreeOnTerminate имеет смысл использовать только если ты создал поток и отпустил его в свободное плавание.
или в деструкторе потока сам озаботился очистить за собой единственную ссылку где-нить в списке потоков.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895630
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Нет, замерил специально, try секции замедляют почти в три раза.
Да быть такого не может! Какая же там "нагрузка" в цикле?)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895883
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Василий 2
Нет, замерил специально, try секции замедляют почти в три раза.
Да быть такого не может! Какая же там "нагрузка" в цикле?)

foo:=i :D
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895890
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2

foo:=i :D
А если без отладчика и в release запустить?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895912
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Василий 2

foo:=i :D
А если без отладчика и в release запустить?

То же самое.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895944
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
rgreat
пропущено...
А если без отладчика и в release запустить?

То же самое.
Значит там есть и except блок и finally. Только с except потеря - максимум 20%
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895955
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Василий 2
пропущено...

То же самое.
Значит там есть и except блок и finally. Только с except потеря - максимум 20%
Если есть finally - значит есть и except, как минимум неявный.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896116
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Barmaley57
пропущено...
Значит там есть и except блок и finally. Только с except потеря - максимум 20%
Если есть finally - значит есть и except, как минимум неявный.

Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896137
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> почему не сделать конструкцию вида: try .. except ... finally ... end ?

Насколько я помню, еще лет 15 назад был соотв. тикет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896358
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ?
Экономия небольшая - всего лишь лишние try и end.

К тому же, в таком случае не совсем очевидно, что будет выполнено первым - except или finally.
Тем более, что я бы, например, хотел бы, чтобы можно было регулировать последовательность:
и так
try ... except ... finally ... end
и так
try ... finally ... except ... end
Но это приведет к ухудшению наглядности кода.

Т.ч. лучше (для наглядности) вручную писать два блока, каких хочешь. Так код понятнее.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896419
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
К тому же, в таком случае не совсем очевидно, что будет выполнено первым - except или finally.

Мне трудно судить, как там это видно с позиций новичка, но вроде вполне очевидно, что finally должен выполняться в финале, сиречь последним
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896421
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
alekcvp
Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ?
Экономия небольшая - всего лишь лишние try и end.

К тому же, в таком случае не совсем очевидно, что будет выполнено первым - except или finally.
Тем более, что я бы, например, хотел бы, чтобы можно было регулировать последовательность:
и так
try ... except ... finally ... end
и так
try ... finally ... except ... end
Но это приведет к ухудшению наглядности кода.

Т.ч. лучше (для наглядности) вручную писать два блока, каких хочешь. Так код понятнее.

Очень наглядно:
Код: pascal
1.
2.
3.
4.
5.
6.
try
  try
  except
  end
finally
end


По сравнению с:
Код: pascal
1.
2.
3.
4.
try
except
finally
end


Последовательность очевидна: try ... except ... finally ... end , т.к. finally из самого названия следует выполняться последней.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896440
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Последовательность очевидна: try ... except ... finally ... end , т.к. finally из самого названия следует выполняться последней.

Ну хорошо, согласен.
Еще один момент.
Если в except произойдет еще одно исключение - я так понимаю, что finally всё равно должно выполниться, так все захотят 100%.
Получается, для finally компилятору нужно будет сделать еще один неявный блок try ... except . В общем, все не так просто и очевидно, как кажется.

В любом случае, мне - более наглядно так:
Код: pascal
1.
2.
3.
4.
5.
6.
try
  try
  except
  end
finally
end


или так:
Код: pascal
1.
2.
3.
4.
5.
6.
try
  try
  finally
  end
except
end



В зависимости от необходимости и ситуации.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896446
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
YuRock
пропущено...
Если есть finally - значит есть и except, как минимум неявный.

Вот странно: есть там есть неявный except, то почему не сделать конструкцию вида: try .. except ... finally ... end ?

https://quality.embarcadero.com/browse/RSP-18291

Resolution: Won't Fix


Marco Cantù with comment:
We are keeping exception blocks as they have been. Works good enough.

Ленивые гандоны.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896480
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Ленивые гандоны.
Ты хочешь, чтобы они еще бы и исключения поломали? Ты представляешь сколько их потом будут чинить?
...
Рейтинг: 0 / 0
25 сообщений из 135, страница 4 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]