Название: Синхронизация потоков Отправлено: IUnknown от Февраль 12, 2007, 18:43 У меня есть QList<Data*> m_list. В нем содержатся Data два вида данных - которые быстро получаются, а другие после долгих вычислений (интерполяции). Есть список где нужно отобразить обе переменные. Я решил в наследнике QAbstractTableModel в методе data их отображать. Нужно сделать так что-бы после того как я заполняю список данными, те что долго считаются подгружались в отдельном потоке.
Не могу никак сделать так что-бы можно было не закончив старую загрузку сново начать новую - выбрасывает ошибку index out of range. добавлено спустя 11 минут: Я прочитал то что написал и сам не понял что я написал. Вот код: Код: class Data Название: Синхронизация потоков Отправлено: mcgeenerman от Февраль 14, 2007, 23:36 на скока я знаю QList очень схож с std::list и он не безопасен в плане потоков, дело в том что в листе доступ к элементам последователный, что и влечёт ошибку доступа к элементу одновременно,
я бы использовал шаблон связанных контейнеров - например std::set<_T>, в Qt, QSet<_T> аналогично, вообще в Qt переписан практически stl, я не проверял твой код но по задачи так выходит, я сталкивался с подобной ошибкой. Название: Синхронизация потоков Отправлено: IUnknown от Февраль 15, 2007, 21:32 QSet не пробовал, но боюсь что он может не подойти, так как я очень часто использую перегруженый оператор []. По числу ответов понял что наверное не очень правильно пояснил. Все кто видели как работаю wdx плагины для TotalCommander-а поймут что мне нужно. Если в списке вы создаете колонку которая например загружает инфу из тегов музыкальных файлов, то она появляется последовательно по мере извлечения, при том что список файлов уже отобразился. И если вы переходите в другую папку, пока информация для всего списка еще не загружена, то тот поток останавляивается и начинается новый для другой директории. Мне нужно организовать похожий список, только даные в потоке будут подгружатся из базы и с нимим будут проводится манипуляции, а уде после этого они будут вставлятся в список.
Буду благодарен за любую информацию, а то программа стоит на месте. Название: Синхронизация потоков Отправлено: nova от Февраль 15, 2007, 22:16 Из всего написанного я понял только одно, ты пытаешся обратится к не распределенным данным:)
По моему тут все просто. 1. читаеш быстрые данные, получаеш сформированный список в котором dataSlow.isNull() == TRUE && bIsLoaded == FALSE. 2.Для ентих данных запускаеш поток который мееедлеееенно читает dataSlow 3. после чтения dataSlow для записи делаеш для большей безопасности кода Код:
Мутекс описываеш в class Data. 4. вмодели делаеш проверку Код:
опятьже для большей безопасноси ;) при необходимости преостанавливаеш поток медленного чтения 1. читаеш новые быстрые данные 2. запускаеш новый поток чтения медленных 3. не забываеш отслеживать парент для новых данных :) и так далее Я так понял у тебя данные в виде дерева :) Название: Синхронизация потоков Отправлено: mcgeenerman от Февраль 15, 2007, 22:20 я просмотрел твой код, не совсем всё понял так как он не полноценный, но я вижу бреш в доступе к переменной члена класса, ты пишеш:
Код: pModel->m_List[i] |