watki i sockety problem

0

Nie moge dojsc co zle robie i jak to naprawic. Poprosze o pomoc.


klasa servera.cpp.

Server::Server(QObject *parent) :
    QTcpServer(parent)
{

    if(!this->listen(QHostAddress::Any,2234))
    }


    this->threadpool = new QThreadPool();
    threadpool->setMaxThreadCount(10);
  



}

Server::~Server(){
this->close();
    this->deleteLater();


}

void Server::incomingConnection(int handle){

  Client * klient = new Client(handle);

this->threadpool->tryStart(klient);

   // klient =0;

}


client.h
class Client:  public QTcpSocket , public QRunnable
{
    Q_OBJECT
public:

    explicit Client(int d): QTcpSocket() {
       this->setSocketDescriptor(d);
    }
...
}

client.cpp
void Client::run(){

    connect(this,SIGNAL(disconnected()),this,SLOT(removeClientFromList()));
    connect(this,SIGNAL(connected()),this,SLOT(addClientToList()));
    connect(this,SIGNAL(readyRead()),this,SLOT(readData()));
    connect(this,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(connectionError(QAbstractSocket::SocketError)));
    
    emit connected();
   
}

void Client::addClientToList(){
    this->write("agggggggggggggggggggggggggggggggsg");
    }


Client::~Client(){
    
    this->abort();
    
    
}


SocketNotifier: socket notifiers cannot be disabled from another thread
QSocketNotifier: socket notifiers cannot be disabled from another thread
ASSERT failure in QCoreApplication: "Cannot send events to objects owned by a different thread. Current thread 3dce40. Receiver '' (of type 'QNativeSocketEngine') was created in thread 3d5088", file c:\ndk_buildrepos\qt-desktop\src\corelib\kernel\qcoreapplication.cpp, line 405

Nie moge dojsc co zle robie i jak to naprawic. Poprosze o pomoc.

0

na początek zauważyłem:

  1. złe użycie deleteLater() powoduje wywołanie operatora delete (a wiec i destruktora), gdy kolejka przetwarzania zdarzeń dojdzie do głosu.
  2. brak otwierania nowego socketa, powinieneś użyć: QTcpServer::nextPendingConnection
0
  1. Czyli nie powinienem wolac tej metody w destruktorze?
  2. POlaczenie jest otwarte jakby z marszu, dlatego nie jest potrzebne wywolanie metody nexPendingCOnnection() aby sie polaczyc, jedynie zeby uzyskac dostep do komunikacji z klientem. Przynajmniej tak u mnie dziala.

Poradzilem sobie juz z tym problemem, wystarczyli wylaczyc kasowanie po skanczeniu watku w threadpool.

Mam jeszcze jedno pytanie, jak komunikowac wszystkike instancje tej samemj klasy, ghdy w ktorejs z nich zaszlo jakies zdarzenie, bez podlaczania signalow i slotow kazdy z kazdym.

Mam jeszcze jedno pytanie :

Da sie poinformowac wszystkie instancje danej klasy, jesli w jednej z nich zaszlo jakies zdarzenie? Instancje roznych watkach.

I zalozmy, ze te obiekty sa tworzone dynamiczne. Tak jak w tym przykladzie w pierwszym poscie, ilosc QTcpSocket'ow jest tworzona zaleznie od tego, ile osob sie poalczylo. Ja chcialbym zrobic, zeby w momencie jak ktos z nich wysle wiadomosc, kazdy z obiektow ( klientow poalczonych) zostal o tym poinformowany. Kazdy klient moze byc przydzielony do innego watku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1