Watek łączy sie z hostem i czeka na dane za pomocą "QTcpSocket::readyRead"
Chciałbym teraz z głównego okna aplikacji wysłać przez istniejące QTcpSocket
Zrobiłem metodę
ConnectTCP::write_data(...)
Metoda write_data() uruchamia sygnał
signal_write_data(...)
Sygnał signal_write_data łacze ze slotem :
void slot_write_data(DATA_stream &mem)
{
socket->write((char*)mem.data(),mem.size()*sizeof(mem[0]));
}
w kodzie sa trzy wersje [1] [2] i [3]
I działa tylko wersja z LAMBDA , dlaczego ?
typedef std::vector<uint8_t> DATA_stream;
class ConnectTCP : public QThread
{
Q_OBJECT
private:
QTcpSocket* socket;
private slots:
void slot_write_data(DATA_stream &mem)
{
socket->write((char*)mem.data(),mem.size()*sizeof(mem[0]));
}
signals:
void signal_write_data(DATA_stream &mem);
public:
void write_data(DATA_stream &mem){
emit signal_write_data(mem) ;
}
private:
void run()
{
QEventLoop eventLoop;
socket = new QTcpSocket(&eventLoop);
socket->connectToHost(QHostAddress("127.0.0.1"), 6001);
// enqueue or process the data
QObject::connect(socket, &QTcpSocket::readyRead, &eventLoop, [socket]
{
// to działa nie istotne dla problemu
QByteArray datas = socket->readAll();
}
// [1] TO NIE DZIAŁA !!! nawet nie uruchamia sie slot_write_data
//QObject::connect(this, SIGNAL(signal_write_data(&DATA_stream)), this, SLOT(slot_write_data(&DATA_stream)));
// [2] TO TEZ NIE DZIALA !!! uruchamia sie slot_write_data ale danie się nie wpisują do SOCKET
//QObject::connect(this, &ConnectTCP::signal_write_data, this, &ConnectTCP::slot_write_data);
// [3] A TO DZIAŁA !!!
QObject::connect(this, &ConnectTCP::signal_write_data, this, [socket](DATA_stream &mem) {
printf("CALL: slot_write_data\n");
if(socket->state() != QAbstractSocket::ConnectedState )
{
printf("!!!! ConnectTCP not connected !!!!\n");
return;
}
if(mem.size()>0)
{
//qDebug()<<socket->state();
qint64 result = socket->write((char*)mem.data(),mem.size()*sizeof(mem[0]));
socket->flush();
qDebug()<<"RESULT="<< result;
}
}// end LAMBDA ConnectTCP::signal_write_data
// Quit the loop (and thread) if the socket it disconnected. You could also try reconnecting
QObject::connect(socket, &QTcpSocket::disconnected, &eventLoop, [&eventLoop]
{
eventLoop.quit();
});
eventLoop.exec();
delete socket;
}//end run()
}//end class