Это случалось со мной не раз и привело к потере многих часов в погоне за призраком. Как правило, когда я отлаживаю действительно сложный код, связанный с синхронизацией, я начинаю добавлять тонны вызовов OutputDebugString (), чтобы получить хорошее представление о последовательности связанных операций. Проблема в том, что Delphi 6 IDE, похоже, может так долго справляться с этой ситуацией. Я буду использовать конкретный пример, который я только что прошел, чтобы избежать обобщения (насколько это возможно).
Я потратил несколько дней на отладку кода блокировки семафоров между потоками, а также кода вычисления метки времени в DirectShow, который вызывал серьезные проблемы. После устранения каждой ошибки, о которой я только мог подумать, у меня все еще была проблема с Skype , на которую мое приложение отправляет аудио.
Примерно через 10 секунд задержка между тем, как я разговариваю и слышу мой голос, выходит из Skype на втором ПК, который я использовал для тестирования - дальний конец звонка - начал расти. Примерно через 20-30 секунд задержка начала расти экспоненциально, и в этот момент у меня появился код, который проверяет, не задерживается ли критическая секция слишком долго.
К счастью, было не слишком поздно ночью, и, пройдя через это раньше, я решил прекратить неустанно отслеживать и отключил большинство OutputDebugString (). К счастью, большинство из них было упаковано в условное определение компилятора, так что это было легко сделать. В тот момент, когда я сделал это, проблемы исчезли, и оказалось, что мой код работает нормально.
Таким образом, похоже, что интегрированная среда разработки Delphi 6 начинает действительно замедляться, когда объем трафика OutputDebugstring () превышает некоторый порог. Возможно, это просто задача добавления строк в панель отладчика журнала событий, которая содержит все отчеты OutputDebugString (). Я не знаю, но я видел похожие проблемы в моих приложениях, когда TMemo или аналогичный элемент управления начинает содержать слишком много строк.
Что те из вас там сделали, чтобы предотвратить это? Есть ли способ очистки журнала событий с помощью какого-либо вызова метода или хотя бы способ ограничения его размера? Кроме того, какие методы вы используете с помощью условных определений, подключаемых модулей IDE или чего-либо еще, чтобы справиться с этой ситуацией?