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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигнало-слотовые соединения в потоках  (Прочитано 3861 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Февраль 28, 2017, 12:01 »

При нажатии на кнопки на тулбаре выполняется слот
Код:
void MainWindow::setConnection()
в котором создается объект потока thread.

Код
C++ (Qt)
void MainWindow::setConnection()
{
   qDebug()<<__FUNCTION__;
   if(thread == NULL){
       thread = new Thread(&port_settings);
       connect(thread,SIGNAL(errorConnect(bool )),this,SLOT(errorConnect(bool))); //не работает
       thread->start();
 
   }
}
 
void MainWindow::errorConnect(bool err)
{
   qDebug()<<__FUNCTION__;
   qDebug()<<err;
 
   if(!err){
       actConnect->setDisabled(true);
       actDisConnect->setEnabled(true);
       actSettings->setDisabled(true);
       timerShow->start(500);
 
       leStatusPort->setText("Подключен");
       leNamePort->setText(port_settings.namePort);
       leBaudPort->setText(QString("%1").arg(port_settings.baudRate));
   }
   else{
       thread->quit();
       thread->wait();
       delete thread;
       thread = NULL;
 
       leStatusPort->setText("Отключен");
       leNamePort->setText(port_settings.namePort);
       leBaudPort->setText(QString("%1").arg(port_settings.baudRate));
   }
}
 
 

В нитке создается экземпляр класса TransportLevel, в котором создается экземпляр класса ChannelLevel.

Код
C++ (Qt)
Thread::Thread(Port_Settings *port_settings,QObject *parent) :
   QThread(parent),
   settings(port_settings)
{
   moveToThread(this);
}
 
Thread::~Thread()
{
}
 
void Thread::run()
{    
   TransportLevel transport(settings);    
   connect(&transport,SIGNAL(errorConnect(bool )),this,SLOT(sl_errorConnect(bool ))); //не работает
   exec();
}
 
void Thread::sl_errorConnect(bool err)
{
   qDebug()<<"Thread "<<__FUNCTION__;
   emit errorConnect(err);
}
 

Код
C++ (Qt)
TransportLevel::TransportLevel(Port_Settings *port_settings, QObject *parent) :
   QObject(parent),
   settings(port_settings)
{                
 
   channel = new ChannelLevel(settings,this);    
   connect(channel,SIGNAL(errorConnect(bool )),this,SLOT(sl_errorConnect(bool )));    
   qDebug()<<"transport channel level = "<<this->thread();
}
 
void TransportLevel::sl_errorConnect(bool err){
   qDebug()<<"TransportLevel"<<__FUNCTION__;
   emit errorConnect(err);
}
 
//========================================================================================
 
ChannelLevel::ChannelLevel(Port_Settings *port_settings,QObject *parent) :
   QObject(parent),
   settings(port_settings)
{
   err = true;    
   serialPort = new QSerialPort(this);
   openPort();
 
   qDebug()<<"thread channel level = "<<this->thread();
}
 
void ChannelLevel::openPort()
{
   qDebug()<<"settings->namePort = "<<settings->namePort;
 
   if(serialPort){
       serialPort->setPortName(settings->namePort);
       if(serialPort->open(QIODevice::ReadWrite)){
           if(serialPort->setBaudRate(settings->baudRate)
                   &&(serialPort->setDataBits(settings->dataBits))
                   &&(serialPort->setParity(settings->parity))
                   &&(serialPort->setStopBits(settings->stopBits))
                   &&(serialPort->setFlowControl(settings->flowControl)))
           {
               if(serialPort->isOpen()){
                   //QByteArray ba;
                   //ba.append(port_settings.namePort + " открыт");
                   //serialPort->write(ba);
 
                   setStrStatus(settings->namePort + " ???\n");
                   //statusString.clear();
                   //statusString = settings->namePort + " ???\n";
                   err = false;
                   qDebug()<<err;
                   emit errorConnect(err);
                   return;
 
               }else{
                   setStrStatus(serialPort->errorString());
                   //statusString.clear();
                   //statusString = serialPort->errorString();
                   err = true;
                   emit errorConnect(err);
                   return;
               }
           }else{
               serialPort->close();
 
               setStrStatus(serialPort->errorString());
               //statusString.clear();
               //statusString= serialPort->errorString();
               err = true;
               emit errorConnect(err);
               return;
           }
       }
   }
   //statusString.clear();
   //statusString = settings->namePort;
   setStrStatus(serialPort->errorString());
   emit errorConnect(true);
   return;
}
 

И к сожалению сигнало-слотовое соединение
connect(&transport,SIGNAL(errorConnect(bool )),this,SLOT(sl_errorConnect(bool )));
в Thread не работает. Не могли бы пояснить почему так?

« Последнее редактирование: Февраль 28, 2017, 12:04 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #1 : Февраль 28, 2017, 13:17 »

Разобрался Смеющийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Февраль 28, 2017, 13:32 »

ммм? Улыбающийся
Записан

__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Февраль 28, 2017, 14:25 »

Вангую асинхронный тип соединения Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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