![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
RelictOs |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 14.2.2012 Репутация: нет Всего: 1 |
Всем привет
![]() Недавно меня посетила идея написать нечто вроде многопоточного загрузщика файлов. Такие данные, как размер, скорость и главное состояние загрузки я решил выводить в TNextGrid (аналог TStringGrid с расширенными возможностями вроде колонок-прогрессбаров). Как я уже сказал, концепция программы предполагает многопоточность, которую в целом и общем я реализовал. Но есть одно но (точнее даже 2). Начну с первого и главного - при загрузке нескольких файлов одновременно они загружаются не одновременно, а по очереди. Код выполнения потока:
Надеюсь, в коде все понятно прокомментированно, и проблема лишь в моей невнимательности или глупости ![]() С нетерпением жду ответов ![]() Теперь вторая проблема - очень хотелось бы реализовать паузу при загрузке, но и это оказалось не так просто. Поскольку Suspend в данном случае (насколько я понял) не лучший метод (хотя и он не работает), я решил сделать это через булевскую переменную. Проблема же в том, что при вызове функции возникает AccessViolation, и я понятия не имею почему и что с ним делать. Код создания потока и собственно паузы:
Хочу уточнить, что в коде первой проблемы вы не заметите применения цикла вроде
потому что из-за изменения алгоритма загрузки(раньше использовал Indy) я ее временно убрал. Но суть проблемы не в несратываемости, а в ошибке при ее вызове из программы. |
||||||
|
|||||||
Illusion Dolphin |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Ну так в коде они загружатся по очереди, откуда им загружаться параллельно? Чтобы реализовать параллельность надо писать пул потоков: 1) Есть список задач, он, например, сохраняется в общее место (класс, потокобезопасный) 2) Запускается N потоков, где N - макс. количество одновременно выполняющихся заданий. N - находится эксперементально, я не думаю что больше 4-5 будет смысл 3) Каждый поток работает по принципу: 3.1) Берёт из общего места задачу (урл и путь) 3.2) Если задачи закончились, то - выход потока 3.3) Работает 3.4) Переход в 3.1 При этом общий полный размер и общее количество загруженных битиков тоже можно хранить в этом общем хранилище с синхронизацией. Для уменьшения блокировок потоков - по таймеру где-то 0,5-1с форма запрашивает у общего хранилище текущее состояние и отобращает прогресс. А теперь по коду.
Не стоит из потока лазить в элементы формы, лучше вызывать call-back процедуру, и форма сама будет решать что делать с прогрессом
Не нужно, убрать
Вызовет утечку памяти, поток останется в памяти. Поток не стоит вызывать если Length(filelist) = 0. Условие на меньше в этом месте - это клиника.
Изврат100%, указатель на объект. Вообще не надо передавать объект, и тем более не стоит делать указатели на классы. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||||||||
|
|||||||||||
RelictOs |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 14.2.2012 Репутация: нет Всего: 1 |
Illusion Dolphin, огромное спасибо
![]() сейчас попробую сделать чтото вроде массива рекордов, в каждом из которых будет храниться ячейка таблицы и инфа(то есть номер ячейки), и поток, который при изменении кол-ва элементов массива будет писать уже в грид (тоесть только он будет иметь доступ к ней). Гениально ![]() |
|||
|
||||
RelictOs |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 14.2.2012 Репутация: нет Всего: 1 |
Попробовал (на мой взгляд) тот способ, что вы предложили. С простым действием(вроде обычного изменения полоски progressbara) сработало.
Но когда то же самое я попробовал со скачкой файла - проблема та же. Код всего тестового файла:
|
|||
|
||||
Illusion Dolphin |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Полная бессмысленность - всё что находится в Synchronize выполняется в основном потоке, т.е. смысла от потока ноль. Попробуйте вот это:
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |