Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись на ЖД из MemoryStream в многопоточном прило, Запись на ЖД из MemoryStream 
:(
    Опции темы
Pcrepair
Дата 25.8.2013, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Добрый день. Есть программа, которая:
- получает список УРЛ изображений
- загружает изображения в MemoryStream (загрузчик ИНДИ)
- записывает в указанный каталог картинки с их именами и расширениями(жпег, жиф, пнг)
методом FStream.SaveToFile('Pic/'+Name+Ftype) прямо из процедуры загрузки картинки

в однопоточном режиме(без использования Tthread) все работает как нужно.
сейчас надо перевести загрузку картинок в многопоточный режим(10 потоков одновременно)

Вопрос: 
- будут ли проблемы при асинхронном обращении к диску для записи файла из нескольких потоков одновременно?
- если будут то какие способы нужно использовать что проблем не было? 
- Синхронайз или там КС вроде как для другого предназначены?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
kami
Дата 25.8.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Pcrepair @  25.8.2013,  14:04 Найти цитируемый пост)
- будут ли проблемы при асинхронном обращении к диску для записи файла из нескольких потоков одновременно?

если одного и того же файла - да, будут. Если файлы разные - то всё норм.

PM MAIL WWW   Вверх
Pcrepair
Дата 25.8.2013, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



то есть какието спецмеры типа синхронайз(при обращении к форме из потока) или КС (при обращении к переменным из потока) не нужны?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
kami
Дата 25.8.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Смотря откуда обращаться...
Если к форме или чему_угодно_визуальному из Tthread - да, что-то типа Synchronize надо.

Если из одного потока (VCL или Tthread) к содержимому другого - да, что-то типа CriticalSection, Mutex etc. надо.

Если поток самодостаточен - то ничего не нужно, в том случае
Цитата(kami @  25.8.2013,  14:21 Найти цитируемый пост)
Если файлы разные - то всё норм.


Добавлено через 2 минуты и 41 секунду
А если разные потоки будут пытаться записать в один файл, то возможны следующие коллизии:
1. Файл будет перезаписан последним потоком, который пытается записать в него.
2. Второй/третий/стопицотый поток не сможет записать в файл, т.к. этот в этот файл еще пишет другой поток.

Это сообщение отредактировал(а) kami - 25.8.2013, 14:29
PM MAIL WWW   Вверх
Pcrepair
Дата 25.8.2013, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



нет там файлы все разные, каждый поток грузит свой файл
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
V0LT
Дата 10.9.2013, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



Глядите в сторону OmniThreadLibrary там можно круче сделать!  smile 
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
PM MAIL ICQ   Вверх
MetalFan
Дата 10.9.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



V0LT, да, Synapse неплохая библиотека. Но у нее есть существенный недостаток - загрузка/отправка данных только из памяти.
Т.е. запросив с пом.функции HttpGetBinary файл в гигабайт, он сначала "скачается" в память, и только потом запишется на диск.
В свое время я переписывал THTTPSend.Document c MemoryStream, создаваемый внутри компонента, на просто TStream, который в т.ч. можно было назначит снаружи (например, создав TFileStream).


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
V0LT
Дата 11.9.2013, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



Цитата(MetalFan @ 10.9.2013,  15:01)
... у нее есть существенный недостаток - загрузка/отправка данных только из памяти.
Т.е. запросив с пом.функции HttpGetBinary файл в гигабайт ...

 smile Стоп, стоп картинка в гигабайт?! Даже слабо могу предположить где файл был в гигабайт ... ну разве что менеджер закачки ... и то никто не будет запрашивать файл одним куском и писать его ... это долго и не рационально ... но это другая история
Pcrepair а чем история то закончилась с многопоточной выдиралкой картинок ?

Это сообщение отредактировал(а) V0LT - 11.9.2013, 08:45
PM MAIL ICQ   Вверх
MetalFan
Дата 11.9.2013, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



V0LT, да, касательно задачи ТС эта особенность конечно не критична... 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.