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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Передачи сигнала в определенный потоков.  (Прочитано 5401 раз)
venom2013
Гость
« : Сентябрь 04, 2013, 10:46 »

Добрый день. Постановка задачи: есть несколько девайсов (количество переменное), необходимо создать поток для каждого и передавать туда данные на обработку.
Мой алгоритм реализации: при запуске программы создать поток для каждого девайса и назначить ему ид - имя девайса, например "0024". Когда я получаю сигнал от девайса, то смотрю на имя и передаю соответствующий поток.
Проблема в том что я не знаю как назначит ид (имя) потоку. Возможно вопрос глупый но опыта работы с потоками 0.     
Записан
mutineer
Гость
« Ответ #1 : Сентябрь 04, 2013, 10:52 »

Завести переменную в наследнике QThread. Или использовать QObject::objectName
Записан
venom2013
Гость
« Ответ #2 : Сентябрь 04, 2013, 10:54 »

Извините, а можно пример? Буду очень благодарен Улыбающийся
Записан
mutineer
Гость
« Ответ #3 : Сентябрь 04, 2013, 10:54 »

Пример чего?
Пример наследования и добавления переменных - в любой книге по С++
Пример objectName в документации
« Последнее редактирование: Сентябрь 04, 2013, 11:01 от mutineer » Записан
venom2013
Гость
« Ответ #4 : Сентябрь 04, 2013, 11:04 »

Большое спасибо. Разбираюсь Улыбающийся
Записан
venom2013
Гость
« Ответ #5 : Сентябрь 04, 2013, 12:21 »

Создаю поток в циклы:
Код:
 while (queryDevice.next()){

        MyThread *thread = new MyThread();
        thread->setObjectName(queryDevice.value(0).toString());
 }


Запрос возвращает n девайсов и каждому потоку назначаю имя соответственно девайсу. Как мне обратиться к потоку с изменим например "0024"?
Записан
mutineer
Гость
« Ответ #6 : Сентябрь 04, 2013, 12:35 »

сложить потоки в QMap, например. тогда можно и без setObjectName обойтись
Записан
venom2013
Гость
« Ответ #7 : Сентябрь 04, 2013, 13:11 »

а если сделать так:
Код:
    while (queryDevice.next()){
       
        MyThread *thread = new MyThread();
        threads.append(thread);
        thread->setObjectName(queryDevice.value(0).toString());
        connect(this, SIGNAL(StringSignal(QString , QString)), thread, SLOT(StringSlot(QString , QString)));
    }

......

    if(threads.at(0)=="0024")
        threads.at(0)->start();

это будет правильно?
Записан
mutineer
Гость
« Ответ #8 : Сентябрь 04, 2013, 13:17 »

нет, потому что MyThread вряд ли можно сравнить со строкой
используй threads.at(0)->objectName()
Записан
venom2013
Гость
« Ответ #9 : Сентябрь 04, 2013, 14:05 »

Большое спасибо!!!
Записан
venom2013
Гость
« Ответ #10 : Сентябрь 04, 2013, 17:00 »

Извините но не могли бы Вы подсказать.
Создаю потоки и слоты:
Код:
while (queryDevice.next()){

        MyThread *thread = new MyThread();
        threads.append(thread);
        thread->setObjectName(queryDevice.value(0).toString());
        connect(this, SIGNAL(StringSignal(QStringList)), thread, SLOT(messageFomMtHostTh(QStringList)));
        connect(thread, SIGNAL(StringSignalToMain(QString)), this, SLOT(slotWriteToMtHost(QString)));
        connect(thread, SIGNAL(logMtHost(QString)), this, SLOT(slotLogFromMtHost(QString)));
        connect(thread, SIGNAL(logPostgres(QString)), this, SLOT(slotLogFromPostgres(QString)));
        connect(thread, SIGNAL(logServer(QString)), this, SLOT(slotLogFromServer(QString)));
        connect(thread, SIGNAL(finished()), this, SLOT(slotThFinished()));
    }
Код:
            if(!threads.at(i)->isFinished())
                threads.at(i)->start();
            list.append(threads.at(i)->objectName());
            qDebug()<<threads.at(i)->objectName()<<thread()->currentThread();    //"0024" QThread(0x889c58)
            threads.at(i)->messageFomMtHostTh(list);


Код:
 virtual void run()
     {
         qDebug()<<currentThreadId()<<currentThread();   //0xf30 MyThread(0x7b62a0, name = "0024")
         //делаем что то в контексте нового потока
         exec(); //запускаем обработку очереди сообщений потока

     }

Запускается тот поток который мне нужно (функция run возвращает). А когда посылаю сообщения "threads.at(i)->messageFomMtHostTh(list);" в функцию

Код:
        thread()->currentThread()->objectName(); //пустая строка 
 

Где ошибка? Извините возможно вопрос глупый но я уже немного запутался.
Записан
venom2013
Гость
« Ответ #11 : Сентябрь 04, 2013, 17:10 »

мне необходимо узнать какой поток завершился.  По окончанию таймера я посылаю сигнал
Код:
    timer->stop();
    emit  finished();

.....   
 if (thread()->isFinished())
            qDebug()<<thread()->currentThread();
ответ должен быть "MyThread(0x617680, name = "0024") "
Записан
mutineer
Гость
« Ответ #12 : Сентябрь 04, 2013, 17:17 »

threads.at(i)->messageFomMtHostTh(list);
при таком вызове выполнение происходит не в потоке из списка (который ты проименовал), а в текущем рабочем потоке (подозреваю что основной поток приложение), который не именован, поэтому и пустая строка вместо имени.

Ну это если я правильно понял этот твой сумбурный поток сознания

currentThread() - это статическая функция, она возвращает текущий поток, то есть поток, в котором сейчас происходит выполнение
« Последнее редактирование: Сентябрь 04, 2013, 17:19 от mutineer » Записан
venom2013
Гость
« Ответ #13 : Сентябрь 04, 2013, 17:21 »

да все правильно ты понял  Улыбающийся. Как вызвать поток из списка? Я целый день над этим сижу и уже не соображаю.
Записан
mutineer
Гость
« Ответ #14 : Сентябрь 04, 2013, 17:23 »

Как вызвать поток из списка?

Что значит "вызвать поток"?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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