Я создаю приложение Delphi для загрузки файлов из Интернета, и если сервер поддерживает запрос диапазона, он будет многопоточным. Прогресс также передается обратно в графический интерфейс.
В текущей модели программного обеспечения используются компоненты TThread
. Графический интерфейс вызывает TDownloadThread
, который затем порождает TDownloadPartThreads
- это потоки, которые фактически выполняют загрузку через WinHttp.
Моя проблема : ЦП израсходован даже для одной загрузки, когда загружается только 4 потока.
Предполагаемые причины:
Synchronize (MainForm.UpdateProgress (Downloaded, TotalSize))
, который, как я слышал, УЖАСНО делать, возможно, мне следует поделиться объектом между потоками, чтобы я мог получить к нему доступ с помощью таймера в основной форме, чтобы обновлять прогресс ? Мои решения
Поочередно записывать файлы и записывать только каждые x
байтов.
Обновите компоненты TThread
для использования OmniThreadLibrary
и каким-то образом отправьте данные обратно в основную форму.Каждый поток TDownloadPart
затем стал бы IOmniWorker
и отправил бы обратно свой прогресс, разделяя объект с основной формой. Затем основная форма будет использовать таймер для обновления своего прогресса, например: ProgressBar1.Position: = sharedDataObject.Progress;
Надеюсь, кто-нибудь сможет указать мне правильное направление!