Поиск:

Ответ в темуСоздание новой темы Создание опроса
> потокозащищенный ptr_vector 
:(
    Опции темы
heavix
Дата 26.5.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Уважаемые господа! Никогда ранее не сталкивался с многопоточностью, но пришлось...
Подскажите пожалуйста как правильно реализовать потокозащищенный ptr_vector...
Задача состоит в следующем:
Некий класс хранит список файлов.
Есть метод, который заполняет этот список (он должен работать в отдельном потоке), - здесь ничего сложного
Есть метод сортировки списка (сортировка по любому параметру списка - их 3: имя файла, дата создания, путь )
Есть Гуи - VirtualListViewControl... - для отрисовки этого списка...
Гуи должно работать в главном потоке...
И вот собственно вопрос:

Как правильно организовать ресурс, что бы пользователь имел доступ к гуи и сортировке, пока идет заполнение списка???

тоесть пользователь выбрал директорию для сканирования... запустился трид... и погнал набивать вектор...
паралельно гуи все это отрисовывает - мьютекс и как бы проблем нет.
но что с сортировкой делать???
Ведь пользователь может щелкнуть по какой либо из колонок... список еще не заполнен до конца, а нужно его уже сортировать...
Очень нужен совет.... 
Всем за ранее благодарен

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


pattern`щик
****


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

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



Цитата(heavix @  26.5.2011,  13:57 Найти цитируемый пост)
но что с сортировкой делать???

полагаю, при сортировке, нужно останавливать заполнение пока не закончится сортировка.
т.е. перед вставкой элемента, пытаешься залочиться на condition`е. если _мьютекс_блокирующий_его_ при сортировке не залочен - то вставка происходит как обычно.
иначе, если началась сортировка, мьютекс который ее защищает лочится, и при попытке вставки(читай строку выше) залочишься на condition`е.
тут есть один нюанс - как сортировка закончится, не забудь разлочить мьютекс. а то будешь вечно висеть на вставке smile 

Это сообщение отредактировал(а) boostcoder - 26.5.2011, 14:33
PM WWW   Вверх
boostcoder
Дата 26.5.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



если залочить контролы гуя пока идет заполнение, то можно обойтись одним мьютексом.

Добавлено через 6 минут и 8 секунд
ах да.. после того как произошла хоть одна сортировка по инициативе юзера, сохраняешь критерий сортировки и последующие вставки производишь дополнением(слиянием).
PM WWW   Вверх
borisbn
Дата 26.5.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



хммм. интересная задачка... можно попробовать след. образом:
Держать копии списка для каждого вида сортировки (не полностью структуры с именем, размером, etc. а только индексы из основного массива). При добавлении очередного файла в основной список лочить только эти копии, вставлять в них - в нужное место - новый индекс структуры, и разлочивать его. А в гую просто переключать списки, в зависимости от типа сортировки. Эдакий аналог БД с индексами.
М.б. не очень связно рассказал, но если понял - хорошо. Нет - спрашивай.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
heavix
Дата 26.5.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем огромное спасибо за быстрый отклик!

Цитата

    если залочить контролы гуя пока идет заполнение, то можно обойтись одним мьютексом.


По ТЗ контролы Гуи должны быть доступны всегда!

Так же по ТЗ сортировка должна быть реализована стандартным алгоритмом std::sort (

Я подумал может сделать свою обвертку для ptr_vector, в которой реализовать потокозащищенные методы  
но не совсем представляю как это реализовать для итератора, что-бы исспользовать например for_each
собственно тогда сортировку можно будет проводить до последнего элемента который был добавлен в список
в момент нажатия контрола сортировки...  


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


pattern`щик
****


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

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



Цитата(heavix @  26.5.2011,  15:09 Найти цитируемый пост)
сортировка должна быть реализована стандартным алгоритмом std::sort

так это гуд.
негуд то, что после первой сортировки все последующие вставки нужно вставлять в уже отсортированный контейнер. я для этого придется после каждой вставки заново сортировать. тормозить все будет жутко.
потому и говорю - слиянием.

Цитата(heavix @  26.5.2011,  15:09 Найти цитируемый пост)
Я подумал может сделать свою обвертку для ptr_vector, в которой реализовать потокозащищенные методы

я тоже.

Цитата(heavix @  26.5.2011,  15:09 Найти цитируемый пост)
но не совсем представляю как это реализовать для итератора, что-бы исспользовать например for_each

а внутреннее устройство контейнера остается неизменным. при чем тут итератор?

Это сообщение отредактировал(а) boostcoder - 26.5.2011, 15:15
PM WWW   Вверх
borisbn
Дата 26.5.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(heavix @  26.5.2011,  15:09 Найти цитируемый пост)
Так же по ТЗ сортировка должна быть реализована стандартным алгоритмом std::sort (

т.е. мой вариант даже не рассматривался ?
там вообще сортировать не нужно. просто вставлять int в отсортированный список int'ов. log2( N ) операций...
ну... как хотите smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
heavix
Дата 26.5.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата


Цитата

но не совсем представляю как это реализовать для итератора, что-бы исспользовать например for_each


а внутреннее устройство контейнера остается неизменным. при чем тут итератор?


может мы подумали о разных вещах...

я предполагал класс с приватным вектором и бустовым мьютексом, 
в класе переопределен интерфейс доступа к элементам вектора, в каждом методе свой lock - стандартный вызов метода вектора-unlock,
а вы о чем? Если можно пример... Я новичек в этом... по этому всегда рад умному совету! Если можно проще - подскажите плиз.   
PM MAIL   Вверх
boostcoder
Дата 26.5.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(heavix @  26.5.2011,  15:28 Найти цитируемый пост)
я предполагал класс с приватным вектором и бустовым мьютексом

все так.
только зачем сортировку выносить наружу? ;)
добавьте еще метод sort(predicate)

PM WWW   Вверх
heavix
Дата 26.5.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Большое спасибо! Кажется теперь вся картинка в голове собралась воедино))
PM MAIL   Вверх
heavix
Дата 26.5.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

т.е. мой вариант даже не рассматривался ?
там вообще сортировать не нужно. просто вставлять int в отсортированный список int'ов. log2( N ) операций...
ну... как хотите   


Ваш вариант очень интересен, но ТЗ не я придумывал!
у меня в таске написано следующее:

3. Use one of the standard STL algorithms to sort the list. Or use container sorting methods instead
if any.

Все равно большое спасибо)
PM MAIL   Вверх
borisbn
Дата 26.5.2011, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



хмм. интересно, а чем
Цитата(heavix @  26.5.2011,  16:28 Найти цитируемый пост)
standard STL algorithms

отличается от
Цитата(heavix @  26.5.2011,  16:28 Найти цитируемый пост)
container sorting methods

?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
heavix
Дата 26.5.2011, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

хмм. интересно, а чем
Цитата(heavix @  26.5.2011,  16:28 )
standard STL algorithms

отличается от
Цитата(heavix @  26.5.2011,  16:28 )
container sorting methods

? 


насколько я понял имется ввиду следующее:

list<int>a;

standard STL algorithms:

#include<algorithm>

sort(a.begin(),a.end(),predicat)

а, container sorting methods:

a.sort(predicat)

только со вторым вариантом у меня както проблематично получалось, когда
boost::bind начинаешь юзать. 

PM MAIL   Вверх
boostcoder
Дата 26.5.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(heavix @  26.5.2011,  16:48 Найти цитируемый пост)
только со вторым вариантом у меня както проблематично получалось, когда
boost::bind начинаешь юзать. 

а проблема-то в чем?
PM WWW   Вверх
borisbn
Дата 26.5.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



heavix, ясно. не знал, что у контейнеров есть метод sort. Щаз посмотрел - вроде только у list'а есть.

Может в твоём ТЗ в п.3 имеется в виду, что если уж использовать сортировку, то только из STL, а не велосипедную ? А если же ты не используешь её вообще, то и вариантов (велосипед vs STL) не будет smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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