sLineBreak

А вы знали, что в модуле System описана константа const sLineBreak = {$IFDEF POSIX} _AnsiStr(#10) {$ENDIF} {$IFDEF MSWINDOWS} _AnsiStr(#13#10) {$ENDIF}; ? Иногда хочется перечитывать сырцы

Читать на сайте автора.

Автоподбор высоты строки MS Excel после объединения ячеек

    Шел 2019-й год… а MS Excel по-прежнему не научился рассчитывать высоту строки если в ней есть объединённые ячейки… И метод Range.AutoFit, который «Changes the height

HTTP Client API в Delphi

Как-то относительно незаметно для меня прошло одно из нововведений Delphi — HTTP Client API. Этот API появился, оказывается, ещё в Delphi XE8 и, даже, получил развитие

Читать на сайте автора.

Условная компиляция в Delphi

Условная компиляция в Delphi, по сути, очень полезная и удобная возможность, которая позволяет Delphi компилировать или не компилировать код в зависимости от определенных символов условной

Читать на сайте автора.

Стандартные действия (TActions) FireMonkey (FMX, FM2)

Впервые библиотека FireMonkey появилась в качестве официальной («из коробки») библиотеки Delphi в релизе Delphi XE2. Однако, поддержка действие (Actions) и, соответственно, списка действий (TActionList) появилась

Читать на сайте автора.

"У нас нет ресурсов для ревью кода" (с)

Последнее время часто слышу «у нас нет ресурсов на ревью кода» или «Нет времени вводить ревью сейчас, у нас много багов, надо их править. Вот

Читать на сайте автора.

Почему компилятор генерирует операции с памятью для полной переменной, даже если задействован только один байт?

Это перевод Why does the compiler generate memory operations on the full variable even though only one byte is involved? Автор: Реймонд Чен.

Когда-то я помогал

Читать на сайте автора.

Поддержка классического оборудования эмуляцией

Это перевод Keeping classic hardware alive through emulation. Автор: Реймонд Чен.

На конференции и выставке Windows 2000, которая совпала с запуском операционной системы, я посетил стенд

Читать на сайте автора.

Зачем нужна красная зона? Я же могу просто использовать стек?

Это перевод Why do we even need to define a red zone? Can’t I just use my stack for anything? Автор: Реймонд Чен.

В Windows стек

Читать на сайте автора.

Ответ на задачку №25

Ответ на задачку №25.
Сначала можно подумать что утверждение — не верно. Действительно:

begin
TMyThread.Create.Start;
end.

Эта программа завершится немедленно, не дав потоку выполниться. Иными словами, программа завершается, когда в ней есть работающие потоки.

Однако, если вы читаете документацию (MSDN) или, например, Рихтера, то заметите, что там говорится о завершении процесса при выходе или завершении всех его потоков. Это явно противоречит ситуации выше.

В чём же дело?

Дело в том, что MSDN и Рихтер говорят о ситуации в «голой» системе, но мы рассматриваем случай, когда поверх системы накладывается ещё код поддержки языка — RTL. Система, действительно, не делает различий между главным и фоновыми потоками и закроет процесс только тогда, когда завершится каждый из потоков — вне зависимости от того, главный он или нет.

Но для RTL разница есть — главный поток выделяется особо. В частности, RTL с помощью «магии компилятора» вставляет скрытый вызов Halt(0) сразу после выполнения главного блока программы (т.е. в строке «end.»). Вот и получается, что при нормальном выходе программы вызывается Halt(0), который, в свою очередь, вызывает ExitProcess, которая завершает все потоки и, следовательно, процесс.

RTL не одинока в таком поведении. Большинство библиотек поддержки языков поступают так же. Почему они это делают? Потому что в современном мире программа понятия не имеет, какие потоки в ней выполняются.

Читать на сайте автора.