我创建了这样的类:
class TcpClient: public QObject
{
public TcpClient(){}
QSocket *socket;
QMutex mutex;
void write()
{
QMutexLocker locker(&mutex);
socket->write();
}
}
class SubQthread :public QThread
{
public:
SubQthread(TcpClient *tcp)
{
//
m_tcp = tcp;
}
private:
TcpClient *m_tcp;
protected:
void run()
{
m_tcp->write();
}
}
class Widget:public QWidget
{
public:
Widget()
{
client = new TcpClient(this);
}
private:
TcpClient *client;
}
当我创建多个子QThread时,我将指针TcpClient *传递给QThread。这是一个好主意吗? 在我可以确保在应用程序完成后删除TcpClient *的条件下。
答案 0 :(得分:1)
您的代码中有多个问题需要解决。
Qt框架中没有QSocket
类。我认为你正在使用QTcpSocket
。
QTcpSocket
s不能跨多个线程使用。只有他们的创建线程才能调用他们的方法。
应该在所有线程之间共享互斥对象。
如果您想在多个线程之间实现通信通道,建议如下:
答案 1 :(得分:0)
QTcpSocket
对象(以及QObject
派生类的每个其他对象)都存在于创建它的线程中。如果您在main(GUI)线程中创建QTcpSocket
对象并希望它存在于另一个线程中,则应使用QObject::moveToThread
方法:qt thread with movetothread。但正确的方法是在工作线程中创建套接字或使用套接字描述符在必要的线程中创建:QAbstractSocket::setSocketDescriptor()
QTcpSocket
对象。为此,您可以使用Signals&有Qt::QueuedConnection