Delphi в основном последовательный в обработке событий. К сожалению, можно указать Delphi обрабатывать другие события, когда вы уже выполняете какое-то событие. В результате новые события будут выполняться, пока ваше текущее событие ожидает завершения нового события. В худшем случае может показаться, что ваше приложение ведет себя нормально, в то время как оно действительно суммирует события в событиях внутри событий.
Правило первое: избегайте использования Application.ProcessMessages, если вам это действительно не нужно.
При использовании COM-объектов все становится немного сложнее, поскольку COM-объект может иметь свои собственные события, запускать свои собственные потоки и делать все другие виды вещей, над которыми у вас нет никакого контроля. COM, кажется, прост в использовании в Delphi, но он имеет много скрытых ошибок для неопытных разработчиков. (У меня до сих пор остались шрамы после нескольких из них!)
В общем, при работе с COM-объектами я пытаюсь разделить COM-вызовы в их собственных потоках, создавая специальные компоненты, которые будут хранить COM-объект в своем собственном потоке, и добавляя много кода синхронизации, чтобы я мог GUI реагирует, пока какая-то длинная задача COM выполняет некоторую обработку. Но для этого требуется большой опыт работы с COM и многопоточностью. Но в основном, разработка вашего пользовательского компонента-оболочки вокруг любого COM-компонента - это хорошая практика, просто для защиты ресурсов, которые нужны вашему COM-классу.
Самая сильная слабость Delphi - это обработка строк и обработка огромных массивов. (Особенно это касается массивов, которые содержат объекты; вместо них используются записи.) Сами строки в Delphi работают быстро, но строковые функции в Delphi не очень оптимизированы. Например, у меня когда-то была строка, содержащая некоторые данные XML. В нем было много логических полей, которые были написаны как «Истина» и «Ложь» и должны были преобразовать их в «истина» и «ложь». Простая замена строки заняла около 15 секунд, чтобы заменить все эти значения. Я переписал его, используя MSXML для загрузки XML в документ DOM, используя XPath, чтобы выбрать все логические узлы, перебрать эти узлы, чтобы заменить все значения соответствующими текстами, а затем поместить XML обратно в одну строку. Внезапно он смог сделать то же самое в течение двух секунд! Огромная производительность радует чего-то медленного.
Причина? Когда Delphi обрабатывает строки, он имеет тенденцию копировать строку несколько раз во время обработки. Или для увеличения размера строки необходимо выделять все больше памяти. Это занимает время, которое не теряется впустую в некоторых других языках, таких как C ++.