Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> написать просмотрщик графических файлов 
:(
    Опции темы
Экскалупатор
Дата 15.7.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Всем привет. хочу сделать просмотр графических файлов на подобии такого как в ACDSee, т.е. открывается куча меленьких картинок из всех картинок в директории, а по щелчку на какой нибудь из них открывается большая, вопрос куда копать, и как сделать что бы не тормозило и не вешала систему. попробовал сделать так(читаю все файлы из директории, потом создаю для каждого файла PictureBox и добавляю его на форму):
Код

int x = 300;
            int y = 400;
            int xLocation = 20;
            int yLocation = 20;
            DirectoryInfo dir = new DirectoryInfo(directory + myDirectory);
            FileInfo[] fileinfo;
            fileinfo = dir.GetFiles();
            foreach (FileInfo f in fileinfo)
            {
                PictureBox pb = new PictureBox();
                pb.Load(directory + myDirectory + f.ToString());
                pb.Location = new System.Drawing.Point(xLocation, yLocation);
                pb.Size = new System.Drawing.Size(x, y);
                pb.TabIndex = 1;
                pb.TabStop = false;
                pb.SizeMode = PictureBoxSizeMode.Zoom;
                pb.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.pb_MouseDoubleClick);
                this.Controls.Add(pb);
                yLocation += y + 20;
            }

оно в принципе работает, но если в директории много файлов(пробовал с 200), то долго тупит, а потом выпадает Out of memory, так что это не подходит, подскажите как сделать.
PM MAIL ICQ   Вверх
Alekz
Дата 15.7.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 5.2.2008
Где: Запорожье, Украин а

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



В PictureBox грузятся полные изображения.
Логичнее показывать thumbnail'ы - это сильно улучшить производительность.
PM MAIL   Вверх
Экскалупатор
Дата 15.7.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Alekz, спасибо, в принципе это ускорило работу, но все равно приходиться ждать пока загрузятся все изображения. а как сделать что бы рисовало и грузило одновременно? я так понимаю это в отдельном потоке нужно делать?
PM MAIL ICQ   Вверх
diadiavova
Дата 15.7.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(Экскалупатор @  15.7.2009,  12:40 Найти цитируемый пост)
я так понимаю это в отдельном потоке нужно делать? 

http://msdn.microsoft.com/ru-ru/library/sy...oundworker.aspx

Цитата(Экскалупатор @  15.7.2009,  12:40 Найти цитируемый пост)
но все равно приходиться ждать пока загрузятся все изображения

А это принципиально, чтобы все сразу грузились? Ведь отобразить 200 маленьких картинок одновременно не реально. Может их лучше подгружать по мере надобности?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Экскалупатор
Дата 15.7.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



diadiavova, конечно не принципиально! просто я не знаю как. это наверное надо держать в памяти только те картинки которые в данный момент на экране(ну можно еще с запасом), но как это сделать, и как потом подгружать, по какому событию(наверное по прокрутке), короче очень много вопросв. а ответов пока нету. BackgroundWorker - это конечно хорошо, но он вроде тоже только все сразу вернет, или можно сделать что бы он возвращал что то через определенный интервал?
PM MAIL ICQ   Вверх
diadiavova
Дата 15.7.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Дело в том, что когда ты располагаешь много пикчербоксов на панели у тебя всё равно память грузится. Я бы вообще отказался от такой идеи. Вместо этого на панели можно разместить несколько пикчербоксов и при смене вида просто менять их свойство Image. Нажимаешь на какую-нибудь кнопочку и в эти пикчербоксы запихивается следующая серия картинок. А сколько из них в памяти держать 0 тебе решать.

Цитата(Экскалупатор @  15.7.2009,  19:52 Найти цитируемый пост)
BackgroundWorker - это конечно хорошо, но он вроде тоже только все сразу вернет, или можно сделать что бы он возвращал что то через определенный интервал? 

Бэкграундвокер выполняет ровно те действия, которые ты пропишешь. В обработчике события DoWork вокера вызови метод , который надо выполнить в отдельном потоке, а чтобы начать выполнение у вокера надо вызвать метод RunWorkerAsync. В своём методе можешь прописать загрузку небольшой порции, а когда понадобится отальное - вызови RunWorkerAsync снова. Метод RunWorkerAsync перегружен, так что можно выполнять операцию с аргументами, которые потом можно передать методу(например диапазон картинок, которые надо грузить). 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Cinemaizer[Олег]
Дата 10.3.2010, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

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



отличная реализация (с сорцами ессно):
http://www.codeproject.com/KB/list/imagelistview.aspx
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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