Условная компиляция в Delphi
Условная компиляция в Delphi, по сути, очень полезная и удобная возможность, которая позволяет Delphi компилировать или не компилировать код в зависимости от определенных символов условной
Условная компиляция в Delphi, по сути, очень полезная и удобная возможность, которая позволяет Delphi компилировать или не компилировать код в зависимости от определенных символов условной
Впервые библиотека 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.
Сначала можно подумать что утверждение — не верно. Действительно:
begin
TMyThread.Create.Start;
end.
Эта программа завершится немедленно, не дав потоку выполниться. Иными словами, программа завершается, когда в ней есть работающие потоки.
Однако, если вы читаете документацию (MSDN) или, например, Рихтера, то заметите, что там говорится о завершении процесса при выходе или завершении всех его потоков. Это явно противоречит ситуации выше.
В чём же дело?
Дело в том, что MSDN и Рихтер говорят о ситуации в «голой» системе, но мы рассматриваем случай, когда поверх системы накладывается ещё код поддержки языка — RTL. Система, действительно, не делает различий между главным и фоновыми потоками и закроет процесс только тогда, когда завершится каждый из потоков — вне зависимости от того, главный он или нет.
Но для RTL разница есть — главный поток выделяется особо. В частности, RTL с помощью «магии компилятора» вставляет скрытый вызов Halt(0)
сразу после выполнения главного блока программы (т.е. в строке «end.»). Вот и получается, что при нормальном выходе программы вызывается Halt(0)
, который, в свою очередь, вызывает ExitProcess
, которая завершает все потоки и, следовательно, процесс.
RTL не одинока в таком поведении. Большинство библиотек поддержки языков поступают так же. Почему они это делают? Потому что в современном мире программа понятия не имеет, какие потоки в ней выполняются.
Это перевод The old-fashioned theory on how processes exit. Автор: Реймонд Чен.
В былые времена жизнь была намного проще.
В прежние времена считалось, что процессы контролируют свои
Релиз RAD Studio 10.3 Rio. Подробности: Что нового в RAD Studio 10.3 Rio Release Notes for Rio Installation Notes for Rio Новые возможности и список
Релиз RAD Studio 10.3 Rio. Подробности: Что нового в RAD Studio 10.3 Rio Release Notes for Rio Installation Notes for Rio Новые возможности и список