glassysmart
یک شنبه 30 آبان 1389, 17:43 عصر
سلام
به کد زیر توجه کنید
#include <QThread>
#include "serialio.h"
struct ConnectionInfo
{
QString comport_number;
int baudrate ;
int data ;
char parity ;
int stop;
};
class QTimer;
class Listener : public QThread
{
Q_OBJECT
public:
explicit Listener(QObject *parent = 0);
bool listenToPort(QString comport_number, int baudrate , int data , char parity ,int stop);
bool IsOpen(){return SerialIO::isOpen();}
void close(){SerialIO::close();}
protected:
void run();
signals:
void received(QString );
void counter(int);
private slots:
void read();
private:
ConnectionInfo _connectionInfo;
};
Listener::Listener(QObject *parent) :
QThread(parent)
{
}
void Listener::run()
{
exec();
}
void Listener::read()
{
static int lastStringLenght;
QString mes = SerialIO::read();
if (!mes.isNull() & !mes.isEmpty())
{
emit received(mes);
emit counter(SerialIO::getCounter());
}
else
{
if (lastStringLenght != 0)
emit endReceivedTextBlock();
}
lastStringLenght = mes.length();
}
bool Listener::listenToPort(QString comport_number, int baudrate , int data , char parity ,int stop)
{
_connectionInfo.comport_number =comport_number;
_connectionInfo.baudrate = baudrate;
_connectionInfo.data = data;
_connectionInfo.parity = parity;
_connectionInfo.stop = stop;
SerialIO::open( comport_number, baudrate , data , parity , stop);
if (SerialIO::isOpen())
{
_startListen(); // start timer to listen
start();
return true;
}
else
{
return false;
}
}
void Listener::_startListen()
{
QTimer *tm = new QTimer();
connect(tm,SIGNAL(timeout()),this,SLOT(read()));
tm->setInterval(30);
tm->start();
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitializeListener();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitializeListener()
{
listener = new Listener();
connect(listener,SIGNAL(received(QString)),ui->tableWidget_received,SLOT(showMessage(QString)));
}
من در این کد می توانم که signal ها را درون thread listener دریافت کنم اما خارج از این thread نمی تواند signal received را دریافت کنم در حقیقت متد زیر فراخونی نمی شود
ui->tableWidget_received->showMessage
به کد زیر توجه کنید
#include <QThread>
#include "serialio.h"
struct ConnectionInfo
{
QString comport_number;
int baudrate ;
int data ;
char parity ;
int stop;
};
class QTimer;
class Listener : public QThread
{
Q_OBJECT
public:
explicit Listener(QObject *parent = 0);
bool listenToPort(QString comport_number, int baudrate , int data , char parity ,int stop);
bool IsOpen(){return SerialIO::isOpen();}
void close(){SerialIO::close();}
protected:
void run();
signals:
void received(QString );
void counter(int);
private slots:
void read();
private:
ConnectionInfo _connectionInfo;
};
Listener::Listener(QObject *parent) :
QThread(parent)
{
}
void Listener::run()
{
exec();
}
void Listener::read()
{
static int lastStringLenght;
QString mes = SerialIO::read();
if (!mes.isNull() & !mes.isEmpty())
{
emit received(mes);
emit counter(SerialIO::getCounter());
}
else
{
if (lastStringLenght != 0)
emit endReceivedTextBlock();
}
lastStringLenght = mes.length();
}
bool Listener::listenToPort(QString comport_number, int baudrate , int data , char parity ,int stop)
{
_connectionInfo.comport_number =comport_number;
_connectionInfo.baudrate = baudrate;
_connectionInfo.data = data;
_connectionInfo.parity = parity;
_connectionInfo.stop = stop;
SerialIO::open( comport_number, baudrate , data , parity , stop);
if (SerialIO::isOpen())
{
_startListen(); // start timer to listen
start();
return true;
}
else
{
return false;
}
}
void Listener::_startListen()
{
QTimer *tm = new QTimer();
connect(tm,SIGNAL(timeout()),this,SLOT(read()));
tm->setInterval(30);
tm->start();
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitializeListener();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::InitializeListener()
{
listener = new Listener();
connect(listener,SIGNAL(received(QString)),ui->tableWidget_received,SLOT(showMessage(QString)));
}
من در این کد می توانم که signal ها را درون thread listener دریافت کنم اما خارج از این thread نمی تواند signal received را دریافت کنم در حقیقت متد زیر فراخونی نمی شود
ui->tableWidget_received->showMessage