Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Lanzar 4 hilos simultáneos y esperarlos (https://www.clubdelphi.com/foros/showthread.php?t=95093)

aguml 26-02-2021 02:00:33

Lanzar 4 hilos simultáneos y esperarlos
 
Buenas amigos, tengo una aplicación que tiene 4 bucles que me congelan la aplicación y quiero meter cada bucle en un hilo para que trabajen simultáneos pero el problema es que necesito saber si alguno de los 4 bucles sale con false para si es así mostrar un mensaje de error y terminar los otros. La cosa es que me encuentro con varios problemas, lo primero es que si lanzo los 4 y espero con WaitForMultipleObjects ¿Como hago para desde un hilo detener al resto de hilos? ¿Algún ejemplo al respecto? Otra duda es que cada hilo debería incrementar un contador común para los 4 y supongo que para eso hay que usar semáforos o algo así pero no tengo ni idea de cómo hacer eso y se me ocurrió que como tengo un TProgressBar al que le puse el rango de 0 a 4 para que cada vez que termine un bucle incremente la barra y me preguntaba si sería suficiente con hacer eso desde los 4 hilos usando Synchronize o si al hacer eso desde los 4 hilos podría darme algún problema.

Neftali [Germán.Estévez] 26-02-2021 13:42:46

Cita:

Empezado por aguml (Mensaje 540201)
tengo una aplicación que tiene 4 bucles que me congelan la aplicación y quiero meter cada bucle en un hilo para que trabajen simultáneos pero el problema es que necesito saber si alguno de los 4 bucles sale con false para si es así mostrar un mensaje de error y terminar los otros.

Lo primero es saber lo que "usan" esos bucles para saber si los puedes meter en un hilo (Bases de Datos, controles visuales,...). O si te costará más o menos.

Cita:

Empezado por aguml (Mensaje 540201)
¿Como hago para desde un hilo detener al resto de hilos? ¿Algún ejemplo al respecto?

Revisa el procedimiento Terminate y el evento asociado.
Si lo usas correctamente, creo que puedes controlar lo que necesitas.
También revisa el WaitFor para lo contrario (tal vez en algun caso debes tener algo esperando hasta que consigas finalizarlos todos).

Cita:

Empezado por aguml (Mensaje 540201)
Otra duda es que cada hilo debería incrementar un contador común para los 4 y supongo que para eso hay que usar semáforos o algo así pero no tengo ni idea de cómo hacer eso y se me ocurrió que como tengo un TProgressBar al que le puse el rango de 0 a 4 para que cada vez que termine un bucle incremente la barra y me preguntaba si sería suficiente con hacer eso desde los 4 hilos usando Synchronize o si al hacer eso desde los 4 hilos podría darme algún problema.

No entiendo lo de incrementar un contador. Si realmente lo necesitas (para saber cuantos han acabado) o quieres hacerlo con un Progressbar, puedes hacerlo sin problemas utilizando Synchronize. En ambos casos se considera un recurso compoartido y debes modificarlo en exclusión. Lo dicho, para eso el Synchronizees suficiente.

aguml 26-02-2021 22:38:09

Ya lo conseguí. Me explico, la idea es que una tarea de fuerza bruta la partí en 4 trozos para dividir el proceso, entonces si uno de los hilos tiene éxito avisar al resto para que terminen la búsqueda. Como eran 4 do while lo que hice fue crear una variable bool y usarla como condición de salida para los 4 bucles con lo que cuando uno de los cuatro tiene éxito la pone a true y terminan todos los hilos y los 4 hilos son creados desde otro hilo el cual se queda esperando con WaitForMultipleObjects. El ProgressBar fue un mal planteamiento la verdad.


La franja horaria es GMT +2. Ahora son las 20:43:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi