- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在最后一个问题中,我没有清楚地表达我的用例。现在我描述我的要求。在我的客户端中,我需要使用 QTcpSocket 连接到服务器。在大多数情况下,我可以在 gui 线程(主线程)中写入和读取。然而,在一些耗时的任务中,我需要一个工作线程来执行任务。当我在 gui 线程中连接服务器时,我一直保持连接。如果我在工作线程中使用新的 QTcpSocket,我必须断开 gui 线程中的套接字吗?并再次连接到服务器?
class Widget:public QWidget
{
Q_OBJECT
public:
Widget()
{
socket = new QTcpSocket(this);
}
private:
QHostAddress host;
unsigned int port;
QTcpSocket *socket;
private slots:
void startConnect()
{
socket->connectToHost(host,port);
}
void sendData()
{
//just send some bytes
//socket->write();
}
void doTimeConsumingTask()
{
//must i disconnect gui->socket connection before the Worker is running?
// socket->disconnectFromHost();
Worker * w = new Worker();
w->start();
}
}
class Worker:public QThread
{
Q_OBJECT
public:
Worker()
{
}
protected:
void run()
{
QTcpSocket socket;
// must i connectToHost again here ?
// do something consuming time
while(true){
//
QThread::msleep(10);
}
}
private:
QHostAddress host;
unsigned int port;
}
最佳答案
您的问题的简单解决方案是不直接从工作线程访问 QTcpSocket。最终,您可能想要对工作线程的套接字进行的所有操作就是向它发送数据和/或从它接收数据。在这种情况下,您可以简单地让工作线程发出带有 QByteArray 参数的信号,然后将该信号连接到 GUI 线程上的槽,然后调用 QTcpSocket 上的 write(const QByteArray& byteArray)
。同样,你可以让你的数据接收函数(无论什么连接到套接字的 readyRead() 信号)要么存在于工作线程中,要么存在于你的主线程中,但是在接收到工作线程需要处理的数据时,通过信号/槽连接将数据传递给它。
另一种方法,如果你必须直接访问套接字(比如,你需要做的不仅仅是写入它,也许你必须能够关闭它或其他任何东西),你需要将该套接字的每次使用都包装在一个互斥量,在两个线程上。这可能最好通过将原始 QTcpSocket 包装在另一个类中来完成,该类只公开您需要的几个方法,并且总是有一个调用,如:QMutexLocker 储物柜(theMutex);
在每个函数的开头。
关于c++ - 如何在多线程中使用QTcpSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592122/
我是一名优秀的程序员,十分优秀!