Многопоток и картинки

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
Доброго времени
а подскажите пожалуйста как реализовать многопоток взятия картинок

есть папка с фото
далее в папке фото подпапки с фото
нужно брать 1 фото с папки к примеру 1(3) загружать
далее объединяю и загружаю все фото
потом удалить папку

как можно реализовать это , чтоб не брал одно и тоже
за ранее спасибо
 

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 786
Благодарностей
2 450
Баллы
113
как можно реализовать это , чтоб не брал одно и тоже
Пути к картинкам или папкам забросьте в список и берите из списка строчки с удалением.
В итоге - каждый отдельный поток сможет взять только один путь.
В чём собственно проблема заключается?
 
  • Спасибо
Реакции: seregakot

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
Пути к картинкам или папкам забросьте в список и берите из списка строчки с удалением.
В итоге - каждый отдельный поток сможет взять только один путь.
В чём собственно проблема заключается?
У меня так и реализовано , берет из папок , ложит в список , с удалением .

Но почему то , при многопотоке , грузит одинаково .
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 786
Благодарностей
2 450
Баллы
113
У меня так и реализовано , берет из папок , ложит в список , с удалением .

Но почему то , при многопотоке , грузит одинаково .
Нет, я не о том, что Вы что-то на диске удалять должны (возможно должны, но это уже другая история).
Я о том, что необходимо пути к папкам забросить в список.
А далее с этого списка брать строчки с удалением.
И вот уже в этот момент, когда мы взяли строчку с удалением - мы фактически находимся в 1 потоке.
В этот момент Вы уже можете отчленить 1 фотку, сделать с ней что-то, и потом остальные фотки - с ними также что-то сделать.
Если всё что выше успешно - удаляем папку по пути, который изначально получали из списка.
Если что-то пошло не так - значит просто возвращаем путь к папке в список (на втором круге попытаемся ещё раз пройти цепочку).

У Вас в этой логике какая-то проблема?
Просто не могу понять в какой именно момент наблюдается проблема при многопотоке...


Пример:
IZennoList list_dirs = project.Lists["dirs"]; // Список, привязан к файлу, содержит пути к всем папкам
List<string> list_images = new List<string>(); // Временный список, будет содержать пути к картинкам.

string dir_path = string.Empty;
lock(SyncObjects.ListSyncer){
    if(list_dirs.Count > 0) {
        dir_path = list_dirs.GetItem("0", true);// взяли с удалением путь к папке
    }
}
if(string.IsNullOrEmpty(dir_path)) throw new Exception("Путь к папке не может быть пустым...");


string pattern = @"*.jpg";
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(dir_path);

string[] files = dir.GetFiles(pattern, System.IO.SearchOption.AllDirectories).Select(f=>f.FullName).ToArray();
if(files.Length > 0) list_images.AddRange(files);
else throw new Exception("В папке нет картинок");

if(list_images.Count > 0) {
    // делаем что-то с картинками - например берем первую с удалением.
    // потом с остальными также что-то делаем
    // если успех - удаляем папку
    // если не успех - возвращаем путь в начальный список...
}
 
Последнее редактирование:

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
Нет, я не о том, что Вы что-то на диске удалять должны (возможно должны, но это уже другая история).
Я о том, что необходимо пути к папкам забросить в список.
А далее с этого списка брать строчки с удалением.
И вот уже в этот момент, когда мы взяли строчку с удалением - мы фактически находимся в 1 потоке.
В этот момент Вы уже можете отчленить 1 фотку, сделать с ней что-то, и потом остальные фотки - с ними также что-то сделать.
Если всё что выше успешно - удаляем папку по пути, который изначально получали из списка.
Если что-то пошло не так - значит просто возвращаем путь к папке в список (на втором круге попытаемся ещё раз пройти цепочку).

У Вас в этой логике какая-то проблема?
Просто не могу понять в какой именно момент наблюдается проблема при многопотоке...


Пример:
IZennoList list_dirs = project.Lists["dirs"]; // Список, привязан к файлу, содержит пути к всем папкам
List<string> list_images = new List<string>(); // Временный список, будет содержать пути к картинкам.

string dir_path = string.Empty;
lock(SyncObjects.ListSyncer){
    if(list_dirs.Count > 0) {
        dir_path = list_dirs.GetItem("0", true);// взяли с удалением путь к папке
    }
}
if(string.IsNullOrEmpty(dir_path)) throw new Exception("Путь к папке не может быть пустым...");


string pattern = @"*.jpg";
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(dir_path);

string[] files = dir.GetFiles(pattern, System.IO.SearchOption.AllDirectories).Select(f=>f.FullName).ToArray();
if(files.Length > 0) list_images.AddRange(files);
else throw new Exception("В папке нет картинок");

if(list_images.Count > 0) {
    // делаем что-то с картинками - например берем первую с удалением.
    // потом с остальными также что-то делаем
    // если успех - удаляем папку
    // если не успех - возвращаем путь в начальный список...
}
 

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
Нет, я не о том, что Вы что-то на диске удалять должны (возможно должны, но это уже другая история).
Я о том, что необходимо пути к папкам забросить в список.
А далее с этого списка брать строчки с удалением.
И вот уже в этот момент, когда мы взяли строчку с удалением - мы фактически находимся в 1 потоке.
В этот момент Вы уже можете отчленить 1 фотку, сделать с ней что-то, и потом остальные фотки - с ними также что-то сделать.
Если всё что выше успешно - удаляем папку по пути, который изначально получали из списка.
Если что-то пошло не так - значит просто возвращаем путь к папке в список (на втором круге попытаемся ещё раз пройти цепочку).

У Вас в этой логике какая-то проблема?
Просто не могу понять в какой именно момент наблюдается проблема при многопотоке...


Пример:
IZennoList list_dirs = project.Lists["dirs"]; // Список, привязан к файлу, содержит пути к всем папкам
List<string> list_images = new List<string>(); // Временный список, будет содержать пути к картинкам.

string dir_path = string.Empty;
lock(SyncObjects.ListSyncer){
    if(list_dirs.Count > 0) {
        dir_path = list_dirs.GetItem("0", true);// взяли с удалением путь к папке
    }
}
if(string.IsNullOrEmpty(dir_path)) throw new Exception("Путь к папке не может быть пустым...");


string pattern = @"*.jpg";
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(dir_path);

string[] files = dir.GetFiles(pattern, System.IO.SearchOption.AllDirectories).Select(f=>f.FullName).ToArray();
if(files.Length > 0) list_images.AddRange(files);
else throw new Exception("В папке нет картинок");

if(list_images.Count > 0) {
    // делаем что-то с картинками - например берем первую с удалением.
    // потом с остальными также что-то делаем
    // если успех - удаляем папку
    // если не успех - возвращаем путь в начальный список...
}
Спасибо вам большое за подсказки .
Может я косячу где то .
Смогу проверить вечером
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 786
Благодарностей
2 450
Баллы
113
Спасибо вам большое за подсказки .
Может я косячу где то .
Смогу проверить вечером
Хорошего дня.
Косяк может быть, когда список с путями к папкам не привязан к файлу - и тогда каждый поток работает с одинаковым набором данных (удаление из списка тогда влияет только на список именно для одного конкретного потока).
Если у Вас реализован алгоритм подобный тому, который я попытался описать - ошибки быть не должно.
 
  • Спасибо
Реакции: seregakot

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
Хорошего дня.
Косяк может быть, когда список с путями к папкам не привязан к файлу - и тогда каждый поток работает с одинаковым набором данных (удаление из списка тогда влияет только на список именно для одного конкретного потока).
Если у Вас реализован алгоритм подобный тому, который я попытался описать - ошибки быть не должно.
Списки привязаны , к файлам .
Посмотрим , может выйдет
И вам большое спасибо и хорошего дня
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 819
Баллы
113
Файл-список с путями к папками сформируйте заранее в отдельном шаблоне, а не в этом же.
Так же проверьте, что отмечена настройка "Сохранять изменения списка в файл" в опциях списка.
 

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
Файл-список с путями к папками сформируйте заранее в отдельном шаблоне, а не в этом же.
Так же проверьте, что отмечена настройка "Сохранять изменения списка в файл" в опциях списка.
Та хотелось бы все в одном делать шаблоне.
Галочки стоят
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
при работе с файлами, чтобы каждый поток не брал один и тот же файл, нужно выбранный файл куда-то перемещать или как-то переименовывать, что само по себе одно и тоже
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)