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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 180 181 [182] 183 184 ... 188
2716  Qt / Общие вопросы / Re: Потоки, сигналы, слоты и потенциальные касяки если связать все это? : Январь 29, 2009, 16:55
О_о.. башка не варит под конец дня...

Значит надо делать так?
Код:
void B::run
{ exec(); }

а в main.c писать: B->start() ?
так что-ли ? Улыбающийся
2717  Qt / Общие вопросы / Re: Потоки, сигналы, слоты и потенциальные касяки если связать все это? : Январь 29, 2009, 16:10
да! нужны! Улыбающийся

я с exec() не очень понял, т.к примеров нету!

т.е если я в вместо A->start() напишу А->exec() - то запустится цикл обработки сообщений и следовательно можно не переопределять ф-ю run() ?
2718  Qt / Общие вопросы / Re: Потоки, сигналы, слоты и потенциальные касяки если связать все это? : Январь 29, 2009, 14:43
Цитировать
от чего там пухнуть? хочешь, чтобы в потоке вызывался сигнал - используй ивентлуп (exec() потоку либо собственный). а вечный цикл убрать. /* кстати, "while (1)" называется "forever" Улыбающийся */
Я не понял насчет евентлупа! Я запуталсо! Грустный
2719  Qt / Общие вопросы / Re: Потоки, сигналы, слоты и потенциальные касяки если связать все это? : Январь 29, 2009, 14:24
Цитировать
2 kuzulis: Возми книгу Jasmin Blanchette, Mark Summerfield C++ GUI Programming with Qt 4 (существут перевод этой книги на русский) и прочти 14 раздел Multithreading.
там нет того что мне нужно! там все не то!
2720  Qt / Общие вопросы / Re: Потоки, сигналы, слоты и потенциальные касяки если связать все это? : Январь 29, 2009, 14:23
Цитировать
1. Работать не будет, читайте ман (нужна петля обработки событий)
блина... читаю... ток голова пухнет! и что - то не могу понять!
Цитировать
2. не обрабатывается команда завершения потока, возможно нарушение приоритетов (starvation)
это я опустил дабы не загромождать код Улыбающийся
Цитировать
3. А зачем?
ну, чтобы поток В прислал потоку А указатель на данные типа *int , т.к поток А тогда по этому указателю вычитает данные быстрее нежели из переменной ... типа для скорости Улыбающийся
Цитировать
> про защиту данных QList от потокобезопасности
каково, а? )
да блина главное смысл понятен о чем я! Улыбающийся
Цитировать
тоже неплохо...
что имеете ввиду?
Цитировать
в целом идея неверная. мб для отдельно взятого случая подобным образом будет и проще, но бесконечный emit sgReadData(j) - это что-то уже за гранью.
ну мне нужно из подсистемы В в подсистему А бесконечно слать некие данные... в принципе я мог бы в бесконечном цикле потока А вызывать некую ф-ю типа B::readData(int i, int data) , предварительно объявив и реализовав ее в подсистеме В... но при этом придется включать #include "В.h" ...
И вообще, в ассистенте написано, что сигналы и слоты для того еще введены, чтобы можно было стыковать объекты м/у собой, которые ничего не знают друг  о друге Улыбающийся (вот я и стыканул)

Цитировать
как я понял из кода выше, списки в обоих тредах должны синхронизироваться (из В в А) - не проще ли использовать что-то вроде QSharedMemory?
ну, или хотя бы посмотри QWaitCondition

нет, вы наверное неправильно поняли.... это я просто списки сюда всунул ... а реально дело так должно быть (в моем идеале Улыбающийся )
1. поток А шлет потоку В сигнал о том, что он хочет из внутреннего хранилища (которое находится в подсистеме В) из "ячейки" с идентификатором ID = 333 получить данные (реально данные могут быть любыми, но в примере это int) : sgReadData(333);
2. поток В принимает этот сигнал и у себя запускает слот slReadData(333);
3. в этом слоте происходит "декодирование" числа 333 (например им закодирован некий путь к объекту внутри подсистемы В в котором хранятся данные)
4. после раскодирования - в слоте происходит чтение этих данных из этого объекта и пусть прочитали число = 999;
5. после того как прочитали - в слоте класса В выдаем сигнал для подсистемы А типа по ссылке ID=333 прочитали данные 999 : sgDataReady(333,999)
6. подсистема А приняв этот сигнал, запускает слот slUpdateData(333, 999) и записывает эти данные 999 в свое внутреннее некое хранилище данных , у которого свои идентификаторы

т.е листы - это просто типа массивов каких-то данных (в принципе я массивы мог бы всунуть)

вот как мне нужно сделать!!!
типа приложение состоять должно из нескольких подсистем А, В, С .. и т.п ..  которые должны работать в своих потоках и общаться между собой (передавать/принимать данные)  желательно только с помошью сигналов и слотов, раз уж придумали тролли этот механизм!

фухх.. Улыбающийся


2721  Qt / Общие вопросы / Потоки, сигналы, слоты и потенциальные касяки если связать все это? : Январь 29, 2009, 13:22
Потоки, сигналы, слоты и потенциальные касяки связанные с этим?

Допустим ,например, в моем приложении имеется две "подсистемы" А и B.
Эти подсистемы представляют собой два экземпляра классов, наследуемых от QThread.
1. Поток А в бесконечном цикле передает потоку В сигнал sgReadData(int i)
о том что он хочет прочитать некие данные.
2.Поток В принял этот сигнал, выполнил свой слот и выдал потоку А сигнал о том,
  что данные готовы...
3. поток А принял от потока В сигнал о том что данные готовы и обновил у себя их

(про защиту данных QList от потокобезопасности я опускаю речь Улыбающийся., сейчас не это главное узнать! )

//---------- подсистема А

Код:
class A: public QThread
{
signals:
   void sgReadData(int i)
protected:
   void run();
private slots:
   void slUpdateData(int i, int data);

private:
   QList<int> list;
}
//
void A::run()
{
   while (1)
   {
     //перебираем все записи в QList и емиттим сигналы о том что классу А нужно получить новые данные
     for (int j=0;j<list.size();++j) {
        emit sgReadData(j);
     }
   }
}
//обновляем данные
void A::slUpdateData(int i, int data);
{
   list[i] = data;
}

//---------- подсистема B
Код:
class B: public QThread
{
signals:
   void sgDataReady(int i, int data);
protected:
   void run();
private slots:
   void slReadData(int i);

private:
   List<int> list;
}
//
void B::run()
{
 ///  НАДО ЛИ ЧТО ЗДЕСЬ ПИСАТЬ???
}
//
void B::slReadData(int i)
{
   emit sgDataReady(int i, list.at(i));
}

в приложении делаем так:

Код:
A *threadA = new(A);
B *threadB = new(B);

connect(A, SIGNAL(sgReadData(int)), B, SLOT(slReadData(int)));
connect(B, SIGNAL(sgDataReady(int,int)), A, SLOT(slUpdateData(int,int)));

threadA->start();
threadB->start();


Вопрос:
1. корректно ли так реализовывать мою идею? (т.е не "захлебнутся" ли потоки (приложение)  таким количеством данных)
2. Какие "косяки" могут вылезти?
3. что если в сигнале класса В sgDataReady, указать для данных не тип int а указатель на *int ? (хотя везде в
    ассистенте передают типы а не указатели!)



2722  Qt / Общие вопросы / Re: QMap и типы ключей Key : Январь 28, 2009, 14:33
Спасибо!

Зы: а откудава Вы, pastor и Ko,  все это знаете? У вас прям на все есть ответы! Ужос! Улыбающийся
2723  Qt / Общие вопросы / Re: Объясните идею Mutex :) : Январь 28, 2009, 13:52
Спасибо большое! Улыбающийся
2724  Qt / Общие вопросы / Re: QMap и типы ключей Key : Январь 28, 2009, 13:48
спс Улыбающийся

т.е так:
Код:
class TLink
{
public:
   int Id1;
   int Id2;
   int Id3;
   ..........
   int InN;
}

inline bool operator<(const TLink&L1, const TLink&L2)
{
    if (L1.Id1 != L2.Id1) return L1.Id1 < L2.Id1);
    if (L1.Id2 != L2.Id2) return L1.Id2 < L2.Id2);
    if (L1.Id3 != L2.Id#) return L1.Id3 < L2.Id3);
............................................................................
    if (L1.IdN != L2.IdN) return L1.IdN < L2.IdN);
}

1. после этого уже мой класс TLink можно применять в качастве ключа key для QMap ?
2. И больше не нужно делать  operator>, operator= и т.д. и т.п ?

Улыбающийся
2725  Qt / Общие вопросы / Re: QMap и типы ключей Key : Январь 28, 2009, 13:29
я сначала хотел состряпать алгоритм поиска объектов перебором по совпадению "ссылки" , которая зранится в текущем выбранном объекте с "ссылкой" - которая пришла с сигналом...
но увидел что в QT есть тип QMap и уж было обрадовался Грустный
2726  Qt / Общие вопросы / Re: QMap и типы ключей Key : Январь 28, 2009, 13:24
эээ... просто мне ключа типа INT мало.... т.е в моем случае ключем должна являться некая "ссылка"
т.е ссылка - некая структкра -  должна состоять из нескольких полей (мне нужно из 7 полей типа Int) - где каждое поле что-то кодирует...

т.е суть в следующем:
1. например из какой-то подсистемы А моего приложения приходит сигнал : dataChanged(Link, Data) предназначающийся для подсистемы Б
2. подсистема Б отловила этот сигнал и начинает "раскодирование" ссылки, т.е сопоставление ее с ссылкой, что записана у нее в QMap - для того, чтобы выделить тот объект в подсистеме Б , для которого предназначены данные Data.

т.е.  если бы мне хватило типа ссылки Link = int - то я б даже и не спрашивал и не парился бы... Грустный
я бы сделал бы так:
Код:
TMyClass *myObj = map.value( Link ); 

и потом бы :
Код:
myObj->setData(Data); 


 
2727  Qt / Общие вопросы / Re: QMap и типы ключей Key : Январь 28, 2009, 13:00
PS: для меня это вопрос жизни и смерти! Улыбающийся
2728  Qt / Общие вопросы / QMap и типы ключей Key : Январь 28, 2009, 12:56
Например такая ситуация, где в качестве ключа используется структура или класс, возвратит ли QMap нужный объект?

Ситуация №1 (в качестве ключа Qmap - класс):

Код:
//имеется класс ключей
class TMyKey
{
   int i;
   int j;
}
//имеется класс объекта
class TMyObj
{
...
}
...
//объявляем переменные ключей
TMyKey Key1;
TMyKey Key2;
....

QMap< TMyKey , *TMyObj> map
....
//инициализируем ключи данными
Key1.i = 1;
Key1.j = 1;

Key2.i = 2;
Key2.j = 2;

//создаем объекты и заносим в мапу ключи и указатели на объекты
TMyObj *myObj1 = new TMyObj ;
 map.insert(Key1, myObj1 );

TMyObj *myObj2 = new TMyObj ;
map.insert(Key2, myObj2 );


потом где-то в программе объявляем:
Код:
TMyKey  Key3;
Key3.i = 2;
Key3.j = 2;
и делаем:
Код:
TMyObj *myObj3 = map.value( Key3 );
Вопрос: вернет ли мапа указатель на объект myObj2 Непонимающий

=====================================================

Ситуация №2 (в качестве ключа QMap - указатель на класс):!!!

Код:
//имеется класс ключей
class TMyKey
{
   int i;
   int j;
}
//имеется класс объекта
class TMyObj
{
...
}
...
//объявляем переменные ключей НО по другому!!!
TMyKey *Key1 = new TMykey;
TMyKey *Key2 = new TMyKey;
....

QMap< *TMyKey , *TMyObj> map
....
//инициализируем ключи данными
Key1->i = 1;
Key1->j = 1;

Key2->i = 2;
Key2->j = 2;

//создаем объекты и заносим в мапу указатели на ключи и указатели на объекты
TMyObj *myObj1 = new TMyObj ;
 map.insert(Key1, myObj1 );

TMyObj *myObj2 = new TMyObj ;
map.insert(Key2, myObj2 );


потом где-то в программе объявляем:
Код:
TMyKey  *Key3 = new TMyKey;
Key3->i = 2;
Key3->j = 2;
и делаем:
Код:
TMyObj *myObj3 = map.value( Key3 );
Вопрос: вернет ли мапа указатель на объект myObj2 Непонимающий

2729  Qt / Общие вопросы / Re: QMap. Очистка??? : Январь 28, 2009, 10:48
Улыбающийся ассистент ассистентом - но реальнее спросить еще и у знающих людей..

всем спасибо! можно закрывать!
2730  Qt / Общие вопросы / Re: QMap. Очистка??? : Январь 28, 2009, 10:17
Цитировать
delete map.take(5);

это удалит и сам указатель и его обнулит и из мапы фсю инфу сотрет про него ?? точно? вы уверены? Улыбающийся
Страниц: 1 ... 180 181 [182] 183 184 ... 188

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