Название: Недопонимаю в потоках Отправлено: crocus от Ноябрь 18, 2006, 05:51 В общем смысл в чем- запускается несколько потоков
Код:
Это код потока: Код:
В потоке идет построчная обработка текста и каждая строка записывается в TableWidget главного окна. Так вот не понимаю как корретно и безопасно вернуть данные list Код: QStringList list = line.split(QRegExp("\\t")); Код: bool NewspaperWindow::showList( const QStringList &list) Последовательный код работает, выигрыш во времени при работе в потоках около 5 с. Название: Недопонимаю в потоках Отправлено: Tonal от Ноябрь 18, 2006, 10:24 Полож QStringList list в очередь - QQueue.
Пошли в главное окно сигнал. По приходу сигнала забери из очереди и добавь в таблицу. Операции положения/забирания над очередью защити QMutex + QMutexLocker. И будет счастье! ;-) Да, чтобы совсем не тормозило, имеет смысл в главном окне обрабатывать не по 1 строке за раз а блоками, по 10 - 100 (в зависимости от общего количества)... Ну и использовать не QTableWidget а QTableView. ;-) Название: Недопонимаю в потоках Отправлено: QCasper от Ноябрь 18, 2006, 16:25 Цитата: "Tonal" Полож QStringList list в очередь - QQueue. Операции положения/забирания над очередью защити QMutex + QMutexLocker. А QQueue разве не потоко-безопасна? Название: Недопонимаю в потоках Отправлено: SLiDER от Ноябрь 18, 2006, 21:37 Цитата: "QCasper" А QQueue разве не потоко-безопасна? Ни в коем случае, QQueue это в чистом виде QList со всеми вытекающими ... Название: Недопонимаю в потоках Отправлено: QCasper от Ноябрь 19, 2006, 05:07 Цитата: "SLiDER" Цитата: "QCasper" А QQueue разве не потоко-безопасна? Ни в коем случае, QQueue это в чистом виде QList со всеми вытекающими ... Я вот как раз таки и думал, что лист безопасен, наверное путаю с STLевским листом... Название: Недопонимаю в потоках Отправлено: SLiDER от Ноябрь 19, 2006, 17:05 Цитата: "QCasper" Цитата: "SLiDER" Цитата: "QCasper" А QQueue разве не потоко-безопасна? Ни в коем случае, QQueue это в чистом виде QList со всеми вытекающими ... Я вот как раз таки и думал, что лист безопасен, наверное путаю с STLевским листом... Опять же, что следует понимать под потокобезопасностью? Как тут недавно говорил Dendy (если мне не изменяет память) и пишут у себя в assistant-е троли, есть два типа потокобезопаности: 1. Reentrancy - когда безопасен вызов разных методов использующих разные данные объекта из разных потоков. 2. Thread-Safety - когда безопасен вызов методов использующих одни и теже данные или вызов одного и того же метода из разных потоков. И если первое можно запросто реализовать не прибегая к помощи объектов межпоточной синхронизации, то, во втором случае, без них, ну ни как, не обойтись. Т.о. со вторым типом все понятно, внедрять объекты синхронизации прямо в класс списка безумное рассточительство вычислительных ресурсов, т.к. вызов блокировки через мутекс по вычислителным затратам на порядки превышает, например, операцию сравнения. А вот каким образом реализовать операции доступа к данным списка, в стиле первого типа, я честно говоря представить себе не могу, исходя из самого принципа построения списка, т.е. когда добраться до определенного элемента можно только посредством последовательного перебора. З.Ы. Хотя в последнем случае я уверен не на 100%, возможно Reentrancy для своего QList-а тролям реализовать и удалось. Хотелось бы услышать мнения других экспертов. :D Название: Недопонимаю в потоках Отправлено: Dendy от Ноябрь 19, 2006, 20:51 1. Reentrant method - можно вьІзьІвать сей метод одновременно из разньІх потоков для разньІх екземпляра класса.
2. Thread safe method - можно вьІзьІвать сей метод одновременно из разньІх потоков для одного и того же екземпляра класса. Потокобезопастность контейнеров заключается в атомарности операций копирования. Можно делать так: Код: QList<int> global_shared_list; В конструкторе итератора создаётся копия списка, ета операция атомарна, реального копирования данньІх не происходит. Если в течении итерации первьІй поток попьІтался изменить контейнер - произойдёт разделение данньІх и второй поток нормально продолжит работать с полученной ранее копией контейнера. Грубо говоря: логически присваивание контейнеров всегда создаёт независимую копию содержимого. Конечно же, если вам нужно изменять контейнер из разньІх потоков - такая схема не подойдёт. Ведь вам нужно будет работать не с копиями данньІх, а с оригиналом. Естественно ето бьІла бьІ непозволимая роскошь утяжелять контейнерьІ до потокобезопастньІх. Здесь нужно использовать в паре с контейнером мутекс. Название: Недопонимаю в потоках Отправлено: SLiDER от Ноябрь 19, 2006, 21:48 Цитата: "Dendy" 1. Reentrant method - можно вьІзьІвать сей метод одновременно из разньІх потоков для разньІх екземпляра класса. Хммммм. Похоже я сам неверно понимал термин Reentrant :oops: , благодарю за доп. разяснения. Название: Недопонимаю в потоках Отправлено: crocus от Ноябрь 20, 2006, 19:03 Цитировать to SLiDER Нельзя ли объяснить участок кода из Вашего примера : Код:
недогоняю.... Цитировать Полож QStringList list в очередь - QQueue. Пошли в главное окно сигнал. По приходу сигнала забери из очереди и добавь в таблицу. Сделал на основе примера SLiDERа Код: #ifndef LISTSTORAGE_H Код: void NewspaperWindow::autoThread() Почти непонимая что делаю :| :| Таблица заполняется правильным количеством строк, но сами данные списка косячные - двоит и как-то бессистемно. Похоже неправильно помещаю данные списка в очередь да и забираю наверно. Поправьте по возможности. Попробывал на одном потоке - количество строк выдает правильно- а вот дальше из 15 строк записи с 1 по 14 идентичные ну и последняя как и должно быть. Похоже что кэшируется?? Последняя то строка выдается правильно. И еще если сделать так Код:
Таблица заполняется корректно из всех 5 потоков. Т.е. без таймаута то ли не успевает прочитать , то ли записать??? Название: Недопонимаю в потоках Отправлено: crocus от Ноябрь 22, 2006, 02:43 У SLiDERа:
Код: SecondTh::SecondTh(QObject *parent) Менял start в сторону уменьшения - все нормально - нет провалов, так может в моем примере нужны семафоры или waitconditions??? А может в TableWidgete не успевает отрисоваться корректно вот и заполняет чем попало??? Название: Недопонимаю в потоках Отправлено: Tonal от Ноябрь 22, 2006, 11:09 Совсем чуть чуть надо изменить:
Цитата: "crocus" <skip> Код: <skip> Код: <skip> Название: Недопонимаю в потоках Отправлено: crocus от Ноябрь 22, 2006, 14:02 Цитировать QStringList th_list У меня в headere определено. Название: Недопонимаю в потоках Отправлено: SLiDER от Ноябрь 22, 2006, 14:34 Цитата: "crocus" Цитировать to SLiDER Нельзя ли объяснить участок кода из Вашего примера : Код:
недогоняю.... Здесь просто происходит инициализация атрибута data через список инициализации конструктора класса. Этот список считается списком фактических параметров для вызова конструктора, производящего инициализацию. Название: Недопонимаю в потоках Отправлено: crocus от Ноябрь 22, 2006, 16:59 То ли лыжи не едут, то ли я уже того, переделал - отправляю теперь не StringList а QString
Код: _ds.getData(th_list); И один хер без использования sleep корректны только первая и последняя строки. З-з-з-ату-у-у-у-у-у-у-у-у-п!!!! Название: Недопонимаю в потоках Отправлено: Tonal от Ноябрь 23, 2006, 15:21 Для тех, кто в танке, объясняю:
Цитата: "Tonal" Совсем чуть чуть надо изменить: Цитата: "crocus" <skip> Код: <skip> Код: <skip> Название: Недопонимаю в потоках Отправлено: crocus от Ноябрь 23, 2006, 16:15 to SLiDER и to Tonal:
Спасибо Вам огромное - золотые Вы люди!!! P.S: Расчувствовался после того как заработало :D Название: Re: Недопонимаю в потоках Отправлено: LisandreL от Июнь 08, 2011, 08:59 Забаньте вы уже этого спамера Crurbappy.
|