![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
Pcrepair |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 16.1.2011 Репутация: нет Всего: нет |
Добрый день. Есть программа, которая:
- получает список УРЛ изображений - загружает изображения в MemoryStream (загрузчик ИНДИ) - записывает в указанный каталог картинки с их именами и расширениями(жпег, жиф, пнг) методом FStream.SaveToFile('Pic/'+Name+Ftype) прямо из процедуры загрузки картинки в однопоточном режиме(без использования Tthread) все работает как нужно. сейчас надо перевести загрузку картинок в многопоточный режим(10 потоков одновременно) Вопрос: - будут ли проблемы при асинхронном обращении к диску для записи файла из нескольких потоков одновременно? - если будут то какие способы нужно использовать что проблем не было? - Синхронайз или там КС вроде как для другого предназначены? --------------------
Сборник рабочего кода Процедур и Функций DelPhi http://validcoderepo.narod.ru/ |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
||||
|
||||
Pcrepair |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 16.1.2011 Репутация: нет Всего: нет |
то есть какието спецмеры типа синхронайз(при обращении к форме из потока) или КС (при обращении к переменным из потока) не нужны?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi http://validcoderepo.narod.ru/ |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Смотря откуда обращаться...
Если к форме или чему_угодно_визуальному из Tthread - да, что-то типа Synchronize надо. Если из одного потока (VCL или Tthread) к содержимому другого - да, что-то типа CriticalSection, Mutex etc. надо. Если поток самодостаточен - то ничего не нужно, в том случае Добавлено через 2 минуты и 41 секунду А если разные потоки будут пытаться записать в один файл, то возможны следующие коллизии: 1. Файл будет перезаписан последним потоком, который пытается записать в него. 2. Второй/третий/стопицотый поток не сможет записать в файл, т.к. этот в этот файл еще пишет другой поток. Это сообщение отредактировал(а) kami - 25.8.2013, 14:29 |
|||
|
||||
Pcrepair |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 16.1.2011 Репутация: нет Всего: нет |
нет там файлы все разные, каждый поток грузит свой файл
--------------------
Сборник рабочего кода Процедур и Функций DelPhi http://validcoderepo.narod.ru/ |
|||
|
||||
V0LT |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 16.6.2009 Репутация: нет Всего: 2 |
Глядите в сторону OmniThreadLibrary там можно круче сделать!
![]() PS Если поглядите обещаю помочь разобраться с ним PPS Из своего опыта: откажитесь от инди в последующих разработках, есть куда более приятные, удобные и функциональные средства. PPPS Юзаем Parallel.Pipeline с заданием NumTasks: первый этап загружаем url (в библиотеке Ararat Synapse есть замечательная процедура function HttpGetBinary(const URL: string; const Response: TStream): Boolean;) в несколько потоков (NumTasks) во втором этапе в один поток (или несколько?!) записываем это хозяйство на жёсткий Это сообщение отредактировал(а) V0LT - 10.9.2013, 14:34 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
V0LT, да, Synapse неплохая библиотека. Но у нее есть существенный недостаток - загрузка/отправка данных только из памяти.
Т.е. запросив с пом.функции HttpGetBinary файл в гигабайт, он сначала "скачается" в память, и только потом запишется на диск. В свое время я переписывал THTTPSend.Document c MemoryStream, создаваемый внутри компонента, на просто TStream, который в т.ч. можно было назначит снаружи (например, создав TFileStream). -------------------- There are always someone smarter than you... |
|||
|
||||
V0LT |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 16.6.2009 Репутация: нет Всего: 2 |
![]() Pcrepair а чем история то закончилась с многопоточной выдиралкой картинок ? Это сообщение отредактировал(а) V0LT - 11.9.2013, 08:45 |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
V0LT, да, касательно задачи ТС эта особенность конечно не критична...
-------------------- There are always someone smarter than you... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |