Russian Qt Forum

Qt => Общие вопросы => Тема начата: yesrus от Сентябрь 26, 2009, 15:37



Название: Доступ из разных потоков к объектам типа QList :help:
Отправлено: yesrus от Сентябрь 26, 2009, 15:37
Здравствуйте! Вообщем проблема в следующем:
Есть структуры+пара переменных:
Код
C++ (Qt)
       struct songs {
       QString file;
       int disk;
       int track;
       } ;
 
       QList<songs> slist;
 
       struct dsk {
       int firsttrack;
       int lasttrack;
       int lasttime;
       } disks[10];
 
       int posit, cutrack;
Как сделать так, чтобы они были доступны из разных потоков ? т.е. чтобы можно было изменить или прочитать\записать данных в них из разных потоков, так же интересует как переделать их в класс.
Почитал про глобальные переменные, но если объявить их глобально то qt ругается, так же не понятно как сделать аналог disks[10] - если структуру dsk объявить не структурой, а классом(имя класса к примеру myclass) - myclass[10] -правильно ли это? Возможно ли сделать динамическую структуру...т.е. без указания начально размера (10) ?
Заранее спасибо за помощь!
qt 4.5, windows xp sp3.


Название: Re: Доступ из разных потоков к объектам типа QList :help:
Отправлено: yesrus от Сентябрь 26, 2009, 16:03
Небольшое дополнение: все это нужно, чтобы передать данные между потоками - я могу сделать это с помощью сигналов, но не могу понять как передать QList типа QList<songs> slist где songs - структура - как объявить этот qlist в дочернем потоке, чтобы потом через сигнал можно было его передать ? И вообще как передать любой объект типа QList с помощью сигнала ?


Название: Re: Доступ из разных потоков к объектам типа QList :help:
Отправлено: yesrus от Сентябрь 26, 2009, 16:42
help....передавать из другого потока сигналами 1000+ переменных не айс....  :(


Название: Re: Доступ из разных потоков к объектам типа QList :help:
Отправлено: BlackTass от Сентябрь 26, 2009, 20:14
Толи у меня под конец субботы плохо с понималкой толи еще что-то, но я не понял в чем проблема.
В передаче кулиста в сигнале? Должен нормально передаваться, но не забудьте зарегестрировать такой тип, чтобы куте о нем знал. В этом поможет метод qRegisterMetaType<TypeName>("TypeName").
В синхронизации данных между потоками? В этом случае вам поможет QMutex, либо другие средства синхронизации.


Название: Re: Доступ из разных потоков к объектам типа QList :help:
Отправлено: SimpleSunny от Сентябрь 26, 2009, 22:41
Для хранения переменных можно сделать некий класс хранилище, в котором уже и заботится о защите данных (QMutex, QReadWriteLock, /etc). Этот класс создается перед запуском потоков, а в потоки просто передаем ссылку на класс с уже заполнеными данными.

Код
C++ (Qt)
class storage
{
public:
QString getString();
void putString(const QString &st);
 
protected:
QList <QString> list;
QReadWriteLock lock;
}


Название: Re: Доступ из разных потоков к объектам типа QList :help:
Отправлено: yesrus от Сентябрь 26, 2009, 22:57
А как передать ссылку на класс в потоки ? И где его создавать этот класс ? (по дефолту есть mainwindow класс, он основной).