Cómo limitar y controlar las series multihilo en Qt
Un breve análisis de la primera experiencia de subprocesos en la serie de subprocesos múltiples en Qt. La primera parte escribió sobre el proceso desde la creación hasta la ejecución de un subproceso, pero esto aún no ha terminado. Cuando se crea, debe ser restringido y controlado. Nosotros es el guardián del hilo. No se puede decir que sea libre, pero debe estar razonablemente restringido. A continuación, hablemos de la parte de control del hilo.
1. Hilo de suspensión
Imagínese una situación si necesitamos dejar la computadora para el uso diario por un período de tiempo. podemos decir: Tome una hibernación temporal para ahorrar electricidad y responder a la protección del medio ambiente. No olvide que la vida con bajas emisiones de carbono es una cuestión de ahora. Lo mismo ocurre con los subprocesos. Si un subproceso no es necesario temporalmente, podemos dejarlo en suspensión por un tiempo. El propósito también es evitar que ocupe recursos por el momento. Es principalmente un problema de ocupación del intervalo de tiempo de la CPU.
Para la suspensión de subprocesos, simplemente llame al método sleep, msleep o usleep de Qthread. Tenga en cuenta que estos tres métodos están protegidos contra estática, lo que significa que solo puede hacer esto en clases heredadas, la única diferencia entre ellos es el. unidad de tiempo.
En cuanto al programa, intentamos ser lo más simple posible, siempre que podamos ver la esencia claramente y usarlo en el método Run de la clase derivada Qthread.
1. void CThread::run()
p>
2. {
3 for(int i=1;i<=10000;i++)
4. {
5. qDebug()<
6. //Por favor, no seas tan rápido, duerme un rato. mientras que antes de continuar
7. }
8. }
2. es el despertar. Si le has dicho al hilo que duerma 10 segundos, y de repente cuando el hilo está medio dormido, cambias de opinión y quieres que se despierte, lamento decirte que no hay nada que puedas hacer, es como un cerdo. , no es el momento. Una solución más apropiada es que la sincronización de subprocesos puede resolver este problema. Esto se discutirá en el próximo artículo sobre sincronización de subprocesos [1/2]. Solo recuerde que el sueño es un sueño forzado, pero ahora no hay forma de proporcionar un despertar forzado. método up.
3. Apagado del hilo
Si un hilo termina de ejecutarse, finalizará su propia vida. Pero muchas situaciones no son tan simples. Cuando un hilo llega a la mitad, se detiene por alguna razón especial.
(1) Método de aborto de subprocesos
Hay dos métodos de aborto, aborto forzado y aborto elegante. Esta redacción puede ser un poco inapropiada, así que hablemos de ello primero. Antes de explicar estos dos métodos, es necesario explicar en detalle qué hace el hilo cuando se cierra.
Cuando se cierra el hilo, el sistema operativo lo eliminará. Esta parte es transparente para nosotros. Para obtener instrucciones detalladas, consulte los libros relevantes sobre el sistema operativo y luego la información de la pila asignada en el hilo. se borrarán juntos, pero si se trata de información asignada en el montón, usted es responsable de borrarla usted mismo, porque el montón está retenido por el proceso y su ciclo de vida no tiene nada que ver con el hilo.
(2) Aborto forzado:
Simplemente llamar al método terminate de Qthread puede forzar el aborto, pero esto traerá muchas consecuencias desastrosas.
El problema más grave es una pérdida de memoria del montón. El hilo se termina por la fuerza y no hay tiempo para limpiar el proceso. Incluso si su hilo se ejecuta hasta el final para limpiar la memoria del montón, no tiene tiempo para ejecutarse. /p>
Por ejemplo, el siguiente fragmento de código
1. void CThread::run()
2. c = nuevo int;
4 para(int i=1;i<=10000;i++)
5. <
7.
8. //limpiar
9. p>
Imagina que el hilo no Al ejecutar eliminar c;, emitiste terminar y sucedió algo desafortunado. De esto, podemos concluir que debemos evitar usarlo tanto como sea posible.
(3) Suspensión elegante:
Entonces, ¿cómo cerrar el hilo con elegancia? Debemos notificar al hilo y dejar que el hilo se haga cargo del cierre por sí solo, y cada uno debe concentrarse en ello. lo que necesitan. Todos podemos hacerlo mejor, pero atraparlo con una mano causará muchos problemas.
Entonces, ¿cómo notificar al hilo? Generalmente se utilizan los siguientes pasos
1. Derive una clase en Qthread y defina un método público que se llamará al abortar, como stop()
2. La persona que llama llama directamente al método de parada
3. Derive el método de parada de la clase y establezca la bandera de parada, que suele ser un miembro bool
4. Cuando se esté ejecutando el método de ejecución, verifique el miembro bool para determinar si es necesario salir del proceso y finalmente realice el trabajo de limpieza
1 //CThread.h
2. . #ifndef CTHREAD_H
3. #define CTHREAD_H
4. #incluye
5. >6. {
7. público:
8. . void stop();
p>11. protegido:
12. void run();
13. >14.bool mParar;
15.
16. /CThread.cpp
19. #include
20. #incluye "CThread.h"
21. QThread(),mStop(falso) p>
22. {
23 }
24. >25. {
26. detener();
27.
28. 29. {
30. int *c = nuevo int;
31. para(int i=1;i<=10000;i++)
32. . {
33 . if (mStop) // determina salir del bucle
34.
{
35. romper;
36.
37. qDebug()<
39. }
40. //limpiar
41. >
43. void CThread::stop()
44. {
45. /p>
47.