Russian Qt Forum
Ноябрь 23, 2024, 19:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Потоки (QThread) и сигналы  (Прочитано 9168 раз)
vunder
Гость
« Ответ #15 : Июнь 25, 2010, 10:52 »

Я бы смотрел самый простой вариант: передать нитке указатели на контейнеры (QList) и пусть нитка их заполняет. А главная отвечает за создание контейнеров, их зачистку и.т.п. Нет проблем с копированием и конструкторами. А можно и не передавать в сигнале, а сделать указатели членами класса нитки.
Да, это мысль. Возможно идеальный вариант для меня. По сути нитей всего 2: основная (GUI) и дополнительная (чтение данных из TCP). Указатели можно передать в конструкторе или через сеттеры, и отправлять сигналы при появлении новых данных. Но тогда нужно добавлять критическую секцию на чтение/запись данных
Записан
explosionhead
Гость
« Ответ #16 : Июнь 25, 2010, 10:59 »

вместо критической секции рекомендую использовать QReadWriteLock. читать одновременно могут многие, а писать только один
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Июнь 25, 2010, 23:29 »

Но тогда нужно добавлять критическую секцию на чтение/запись данных
Это так или иначе неизбежно при работе с 2 или более нитками. Но если использовать QList то все просто - ведь данные размером > 4(8 ) байт не перемещаются в памяти.

Код
C++ (Qt)
static QMutex theMutex;
 
// для обработчика используем GetListSize (вместо theList.size())
int GetListSize( MyList & lst)
{
QMutexLocker lock(&theMutex);
return lst.size();
}
 
// защищаем добавление
void Add2List( MyList & lst, const MyObj & obj )
{
QMutexLocker lock(&theMutex);
lst.push_back(obj);
}
 
// обработчик
...
int i, limit = GetListSize(lst);
for (i = 0; i < limit; ++i) {
// обработка элемента
}
 
Записан
SABROG
Гость
« Ответ #18 : Июнь 26, 2010, 12:17 »

вместо критической секции рекомендую использовать QReadWriteLock. читать одновременно могут многие, а писать только один

Лучше сразу изучать lock-free алгоритмы на атомарных операциях, чтобы потом небыло претензий по поводу падения скорости из-за мутексов и т.п.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.179 секунд. Запросов: 22.