Unsolved readyread() signal doesn't emit after sendmessage() signal on pushbutton
-
I would guess it's a threading problem - don't use threads when you don't need them (and don't understand it's consequences). The first thing which shows me that you don't really understand what you're doing is that you're using Qt::DirectConnection - it's not needed in 99,99% of all usecases. Qt knows what connection type to use.
And since you're using thread I would guess that the QTcpSocket is not created in the htread from where you access it (either reading or writing, don't know your code) and therefore you kill the socket notification which exactly explains your findings. -
The code emits a sendmessage() signal from the MainWindow class. Nothing shown connects the signal to anything. It is entirely possible nothing is listening to it and therefore nothing happens.
The code has a sendmessage() function on a class called fthread. The function is not related to the signal in MainWindow. It's not clear whether you think it is or not.
-
@Christian-Ehrlicher I have attached my code in the question and I have created a QTcpSocket. The whole program is working fine until I press the send button and after that the readyread() and disconnected() signla doesn't emit.
-
@ChrisW67 I have attached the code for sendmessage() signal
-
Hi
Did you put a break point in each sendmessage and gotNewMesssage functions to make sure you did not
create a ping-pong situation where signals are kept firing? -
@mrjj as soon as the signal is emitted it executes a slot and then returns and continue its execution. There is some problem in threading. Like I also checked after putting a sleep statement in readyread() signal in fthread.cpp file and it worked fine for like some time and after that it crashed and then didin't work
-
well put breakpoints on the slots and check they are called just once when you press the send button.
-
@mrjj Yes, I have checked right nnow the slots are only called once
-
@fari35
I have told you before to putqDebug()
statements in. You are supposed to do more investigation yourself and report the exact problem rather than just keep throwing your whole code at the community for answer.... -
@JonB I didn't attch the whole code initially but after they asked for it , I've attached my whole code, but now I have cut it short. the problem I'm getting is that readyread() siggnal is not emitting after send button is pressed. Before pressing the send button it emits even if the client sends 10 messages it emits 10 times but as soon as the send button is pressed it stops emitting
-
The code still does not show where the QTcpSocket is created - and when it's like I guess you implemented it, it's still created in the wrong thread. Please provide a minimal, compilable example!
-
@Christian-Ehrlicher here is the code for run() where QTcpSocket is created:
void fthread::run() { tcpSocket = new QTcpSocket(); if (!tcpSocket->setSocketDescriptor(socketDescriptor)) { emit error(tcpSocket->error()); return; } connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead())); connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnected())); exec(); }
-
@fari35 said in readyread() signal doesn't emit after sendmessage() signal on pushbutton:
connect( this, SIGNAL(sendmessage(QString)),thread_obj, SLOT(sendmessage(QString)));
As I said - the function
sendmessage(QString)
is executed in the main thread. Please read the docs about QThread or don't use QThread at all when you don't know the basics. There is no reason to use threads at all... -
@Christian-Ehrlicher Actually I need to make a multi threaded server for my project and I'm using Qt for that. I want to send the message to all the clients who have been assigned a separate thread, Can you please tell me how can I do that because I'm not getting it.
-
@fari35
What is it you need beyond the Threaded Fortune Server Example ? How much are you based on that? -
@JonB In this example it's not shown how to send the message to the client if the signal is emitted from the main thread like here I'm making a UI for the server so I want to send the message to the client as soon as the send button is clicked, but I don't know how to do it. I'm not even getting help from anywhere.
-
Again: if you want to use thread (for whatever reason, maybe just to show that you're a famous programmer...), make sure you understand what you're doing and read the documentation and examples:
"It is important to remember that a QThread instance lives in the old thread that instantiated it, not in the new thread that calls run(). This means that all of QThread's queued slots and invoked methods will execute in the old thread. Thus, a developer who wishes to invoke slots in the new thread must use the worker-object approach; new slots should not be implemented directly into a subclassed QThread."
-
@fari35: To clarify the documentation quoted by @Christian-Ehrlicher's: Do not implement any slots in
fthread
. Instead, implement your slot in a separate QObject. Create that object together withtcpSocket
. -
@JKSH @Christian-Ehrlicher If I implement the slot in a separate Qobject then how can I send the data from that class as my TcpSocket is created in fthread class?
My issue is same as this one :
https://stackoverflow.com/questions/35927165/qt-multi-threaded-multi-client-tcp-server-socket-write-issue/65750692#65750692 -
@fari35 said in readyread() signal doesn't emit after sendmessage() signal on pushbutton:
If I implement the slot in a separate Qobject then how can I send the data from that class as my TcpSocket is created in fthread class?
Let's take a step back.
Imagine that your server only needs to communicate with one client. Imagine that you have no threads; your QTcpSocket is in the main thread. How can you send data from a QObject to the socket?