CloudMailRu icon indicating copy to clipboard operation
CloudMailRu copied to clipboard

Фоновые загрузки + выключение TC = ошибка приложения

Open pozitronik opened this issue 7 years ago • 2 comments

Закрытие главного окна TC при любой фоновой активности ведёт к появлению ошибки: потоки операций продолжают работу, обращаясь к уничтоженным объектам. При этом передаваемые данные могут быть испорчены. К сожалению, предотвратить это нельзя: по всей видимости, в TC никак не предусматривается подобная ситуация. Всё, что происходит - передача DLL_PROCESS_DETACH в DllProc. Возможности, скажем, отложить закрытие TC до завершения фоновых операций нет. Продолжить работу фоновых задач без TC тоже нельзя - потоки взаимодействуют с TC, и предсказуемо упадут с ошибкой. Экстренное завершение потоков при получении DLL_PROCESS_DETACH также ведёт к ошибке, видимо из-за завязки на ssl-библиотеки. Подробнее разобраться не выходит, отладка многопоточных библиотек в Delphi практически невозможна.

Хорошим вариантом может стать вызов FsStatusInfo с новым флагом FS_STATUS_EXIT, в обработчике плагин смог бы корректно завершить работу. Впрочем, вопрос требует изучения.

pozitronik avatar Sep 30 '17 17:09 pozitronik

отладка многопоточных библиотек в Delphi практически невозможна.

с каких это пор? )

ashumkin avatar Oct 04 '17 08:10 ashumkin

Ладно, возможно я не так выразился. Я не претендую на великое знание вопроса, и ориентируюсь только на свой опыт. Дельфовский отладчик постоянно виснет при трассировке многопоточных приложений, независимо от используемой машины и программной среды. Я прекрасно помню, что ещё Delphi 7 тоже висла в этом случае, и промежуточные версии тоже. Допускаю, что возможно я чего-то не знаю, может быть даже упустил какую-нибудь очевидную галочку в настройках. Если так - буду рад подсказке. Хотя мне всё равно кажется, что текущую задачу это решить не поможет. TC закрывает соединения, выгружает dll плагина, и завершается. Единственная возможность что-то сделать - при запросе FsDisconnect не возвращать результат, пока не завершатся фоновые потоки - но потоки, по всей видимости, приостанавливаются, пока TC ждёт ответа на FsDisconnect. Это пока что всё, что видно в первом приближении. Подробное изучение вопроса я отложил до появления свободного времени.

pozitronik avatar Oct 04 '17 08:10 pozitronik