En la revisión #5076, añadí un nuevo componente llamado gb.task que te permite ejecutar una clase en segundo plano.
Internamente, "simplemente" se bifurca el intérprete. Pero en realidad no es tan simple
¿Cómo funciona?
Una vez que marcas gb.task en el IDE obtienes una nueva clase denominada "Task".
Para ejecutar una clase en segundo plano:
- Esa clase debe heredar de Task.
- También debe contener un método público llamado "Main" que no toma argumentos ni retorna valor. Éste es el método que se ejecutará en segundo plano.
Al instanciar la clase el nuevo objeto se ejecutará automáticamente tan pronto como el bucle de eventos comience a ejecutarse.
El objeto tarea disparará un evento "Kill" cuando haya terminado.
Puedes esperar a que una tarea termine usando su método Wait().
Puedes detener una tarea invocando a su método Stop().
Puedes obtener el identificador de proceso de la tarea mediante su propiedad Handle.
Debido a que el método se ejecuta mediante un sub-proceso tiene acceso a cualquier otra parte del programa, excepto que el proceso principal que ejecuta la tarea no verá ningún cambio que ésta realice.
El proceso principal puede modificar algunas variables públicas de la clase Task como un modo de definir los argumentos de esa tarea. Sin embargo, todavía no está implementada la posibilidad de que la tarea hable con el proceso principal para devolverle el resultado de su trabajo.
Tal vez, el método Main() de la tarea tendrá un valor de retorno de tipo Variant que será serializado de forma transparente, enviado al proceso principal y deserializado. Una alternativa sería redireccionar la salida estándar de la tarea a una canalización (tubería) que será leída por el proceso principal.
O tal vez implemente ambas soluciones... todavía no lo sé.
Otra cuestión: no creo que gb.qt4 o gb.gtk pueda usarse después de la bifurcación (fork) del intérprete.
Díganme qué les parece.