NO, only one thread. I am reading data from socket and processing the 'read data' in a 'processing thread'. Each socket is associated with a processing thread.
// Sample Code Snippet - Not Complete
// Data Receiving Class
{
public:
DataClient();
QDataStream m_dstreamData;
// To be associated with socket for data access void slotReadData();
};
DataClient::DataClient()
{
// Setup Network Session and Establish Socket Connection
....
m_dstreamData.setDevice(m_tcpSocket);
// Setup Handlers for Reading Data from Socket
connect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(slotReadData()));
....
}
void DataClient::slotReadData()
{
qint64 nBytesAvailable = m_tcpSocket->bytesAvailable();
if (nBytesAvailable < (int)sizeof(quint16)) // Sufficient Data NOT Arrived
{
return;
}
// Any other Data Checking Statements
...
}
class DataClient: public QObject
{
public:
DataClient();
QTcpSocket m_tcpSocket;
QDataStream m_dstreamData; // To be associated with socket for data access
void slotReadData();
};
DataClient::DataClient()
{
// Setup Network Session and Establish Socket Connection
....
m_dstreamData.setDevice(m_tcpSocket);
m_dstreamData.setVersion(QDataStream::Qt_4_0);
// Setup Handlers for Reading Data from Socket
connect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(slotReadData()));
....
}
void DataClient::slotReadData()
{
qint64 nBytesAvailable = m_tcpSocket->bytesAvailable();
if (nBytesAvailable < (int)sizeof(quint16)) // Sufficient Data NOT Arrived
{
return;
}
// Any other Data Checking Statements
...
}
To copy to clipboard, switch view to plain text mode
// Data Processing Thread Class
class DataClient; // Forward Declaration
class DataProcessor
: public QThread{
public:
DataProcessor();
DataClient *m_pDataClient;
bool m_bStopped;
void run();
};
DataProcessor::DataProcessor()
{
// Initialization
....
m_pDataClient = new DataClient;
m_bStopped = false;
.....
}
void DataProcessor: run()
{
while(!m_bStopped)
{
// Access DataClient's Socket for Data and Process
m_pDataClient->m_dstreamData >> dataItem1;
m_pDataClient->m_dstreamData >> dataItem2;
.....
.....
m_pDataClient->m_dstreamData >> dataItemn;
// Process the Data
.....
// Publish Processed Data to MainWindow and other Objects by Emitting Signals
}
}
class DataClient; // Forward Declaration
class DataProcessor: public QThread
{
public:
DataProcessor();
DataClient *m_pDataClient;
bool m_bStopped;
void run();
};
DataProcessor::DataProcessor()
{
// Initialization
....
m_pDataClient = new DataClient;
m_bStopped = false;
.....
}
void DataProcessor: run()
{
while(!m_bStopped)
{
// Access DataClient's Socket for Data and Process
m_pDataClient->m_dstreamData >> dataItem1;
m_pDataClient->m_dstreamData >> dataItem2;
.....
.....
m_pDataClient->m_dstreamData >> dataItemn;
// Process the Data
.....
// Publish Processed Data to MainWindow and other Objects by Emitting Signals
}
}
To copy to clipboard, switch view to plain text mode
So each socket (around 10 sockets for 10 data channels) is associated with a processing thread.
Does the above scheme work fine?
swamy.
Bookmarks