Qt invokeLlamada asíncrona al método
En los programas, a menudo llamamos funciones. Si la llamada a la función lleva mucho tiempo, la llamada sincrónica hará que el programa principal se bloquee. Qt resuelve este problema proporcionando una función conveniente QMetaObject::invokeMethod que es fácil de llamar de forma asincrónica. En este artículo, solo analizamos cómo utilizar QMetaObject::invokeMethod.
Esta función se utiliza para llamar a un miembro (señal o ranura) del objeto. Devuelve verdadero si se puede llamar al miembro; falso si no hay ningún miembro o los parámetros no coinciden.
QMetaObject::invokeMethod Además de las funciones anteriores, hay otras cinco funciones sobrecargadas, por lo que no entraré en detalles aquí.
Parámetros:
obj: puntero del objeto llamado
miembro: nombre del método del miembro
tipo: método de conexión, el valor predeterminado es Qt::AutoConnection
ret: Recibe el valor de retorno de la función llamada.
val0 ~ val9: pasa los parámetros de la función llamada, hasta diez parámetros
Nota: debe usar la macro Q_RETURN_ARG() para encapsular el valor de retorno de la función, y use Q_ARG() Las macros encapsulan los parámetros de función.
Si el objeto obj tiene una función de ranura func(QString, int) con un valor de retorno de bool, su proceso de llamada es el siguiente:
Nota: Llamadas asincrónicas usando Qt:: QueuedConnection no funcionará Obtenga el valor de retorno, debido a que esta conexión solo es responsable de enviar eventos a la cola de eventos y regresar inmediatamente, el valor de retorno de la función no se determinará.
Sin embargo, podemos usar la conexión Qt::BlockingQueuedConnection mencionada anteriormente, que bloqueará el hilo que emitió la señal hasta que regrese la ranura de conexión de la cola y luego reanudará el bloqueo, de modo que tengamos la garantía de obtener la conexión Qt::BlockingQueuedConnection mencionada anteriormente. retorno del valor de la función. Cómo usarlo es el siguiente:
Tenga en cuenta que la documentación oficial de qt advierte que el uso de este tipo de conexión para comunicarse entre objetos en el mismo hilo conducirá a un punto muerto
Finalmente, debido a la conexión El tipo predeterminado es Qt::AutoConnection, por lo que si el objeto llamado no está en el mismo hilo que la persona que llama, el tipo de conexión se puede llamar directamente cuando el obj llamado no está en el mismo hilo que la persona que llama: p>
Cuando se usa QMetaObject ::invokeMethod Al llamar a una función, si los parámetros de la función tienen tipos personalizados, el programa informará un error porque los tipos llamados deben ser señales, ranuras y tipos reconocidos por el sistema de metaobjetos Qt. Puede registrar tipos personalizados utilizando qRegisterMetaType() proporcionado por Qt Named Types.
Un ejemplo es el siguiente: