Red de conocimiento informático - Conocimiento informático - Cómo liberar el objeto QUdpSocket creado en el hilo

Cómo liberar el objeto QUdpSocket creado en el hilo

La reimpresión a menudo requiere un nuevo QUdpSocket para enviar y recibir datos mientras QThread se está ejecutando. En este momento, la liberación de este objeto de socket se convierte en un problema problemático.

Si el objeto socket se elimina directamente en el destructor del hilo, se producirá la siguiente excepción:

QSocketNotifier: el notificador de socket no se puede deshabilitar desde otro hilo

ASSERT en QCoreApplication::sendEvent falló: "No se puede enviar el evento a un objeto propiedad de un subproceso diferente. Subproceso actual 560cb8. Receptor creado en el subproceso a617748" en el archivo kernel/qcoreapplication.cpp, línea 349" El tipo es "QNativeSocketEngine")

El parámetro pasado a la función de tiempo de ejecución de C no es válido.

El parámetro pasado a la función de tiempo de ejecución de C no es válido.

La siguiente es la solución: <. /p>

1. Defina un identificador liberado por el hilo en el hilo

2. Utilice while para determinar el identificador para finalizar el objeto de socket. el destructor de subprocesos, establezca la bandera y use quit() y wait()

El código es el siguiente:

Subproceso de socket UDP:: Subproceso de socket UDP (q object * parent. ):

QThread(padre)

{

Esto - gt; socket = 0

Esto - gt = false;

}

Subproceso de socket UDP::~ Subproceso de socket UDP()

{

Esto - gt needStop = true

p>

salir();

esperar();

}

void UdpSocketThread::run()

{

socket = new QUdpSocket

connect(socket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams());

socket-gt;bind (2234);

exec();

mientras(esto- gt;needStop)

{

si(esto-> socket)

{

Eliminar este->socket;

Este->socket = 0;

}

Break;

}

}

La liberación de este objeto de hilo es representativa y debería ser posible Resuelva muchos problemas similares.

Además, pueden existir otros métodos, aquí tienes solo uno.

De hecho, la clave del problema es que los objetos creados en el hilo deben liberarse en el hilo.

PD:

Después de la corrección de Shiroki, QT en realidad tiene un mejor mecanismo para liberar objetos. Eso es eliminar más tarde (). Entonces, es simple.

Mire el código:

Subproceso de socket UDP::Subproceso de socket UDP (objeto q * padre):

QThread(padre)

{

socket = 0;

}

Subproceso de socket UDP::~ Subproceso de socket UDP()

{

Esto -gt ; socket - gt; eliminar más tarde();

salir();

esperar(); UdpSocketThread::run()

{

socket = nuevo QUdpSocket

conectar(socket, SEÑAL(readyRead()), esto, SLOT(readPendingDatagrams()

Socket - gt; bind(2234);

exec();