CloudMailRu
CloudMailRu copied to clipboard
Фоновые загрузки + выключение TC = ошибка приложения
Закрытие главного окна TC при любой фоновой активности ведёт к появлению ошибки: потоки операций продолжают работу, обращаясь к уничтоженным объектам. При этом передаваемые данные могут быть испорчены. К сожалению, предотвратить это нельзя: по всей видимости, в TC никак не предусматривается подобная ситуация. Всё, что происходит - передача DLL_PROCESS_DETACH в DllProc. Возможности, скажем, отложить закрытие TC до завершения фоновых операций нет. Продолжить работу фоновых задач без TC тоже нельзя - потоки взаимодействуют с TC, и предсказуемо упадут с ошибкой. Экстренное завершение потоков при получении DLL_PROCESS_DETACH также ведёт к ошибке, видимо из-за завязки на ssl-библиотеки. Подробнее разобраться не выходит, отладка многопоточных библиотек в Delphi практически невозможна.
Хорошим вариантом может стать вызов FsStatusInfo с новым флагом FS_STATUS_EXIT, в обработчике плагин смог бы корректно завершить работу. Впрочем, вопрос требует изучения.
отладка многопоточных библиотек в Delphi практически невозможна.
с каких это пор? )
Ладно, возможно я не так выразился. Я не претендую на великое знание вопроса, и ориентируюсь только на свой опыт. Дельфовский отладчик постоянно виснет при трассировке многопоточных приложений, независимо от используемой машины и программной среды. Я прекрасно помню, что ещё Delphi 7 тоже висла в этом случае, и промежуточные версии тоже. Допускаю, что возможно я чего-то не знаю, может быть даже упустил какую-нибудь очевидную галочку в настройках. Если так - буду рад подсказке. Хотя мне всё равно кажется, что текущую задачу это решить не поможет. TC закрывает соединения, выгружает dll плагина, и завершается. Единственная возможность что-то сделать - при запросе FsDisconnect не возвращать результат, пока не завершатся фоновые потоки - но потоки, по всей видимости, приостанавливаются, пока TC ждёт ответа на FsDisconnect. Это пока что всё, что видно в первом приближении. Подробное изучение вопроса я отложил до появления свободного времени.