multithreading - library - thread python 3
JavaFX2: ¿Puedo pausar una Tarea/Servicio de fondo? (1)
Estoy intentando configurar un servicio en segundo plano que realice la carga masiva de datos de transacción desde un archivo csv. Este servicio de fondo se iniciará a partir de una acción de elemento de menú asignada a un método en la clase de controlador / presentador.
Muy a menudo, algunos datos aparecen en el archivo csv para el cual no se pueden encontrar datos maestros en la base de datos, esto normalmente haría que la carga se estrangulara y fallara.
En tales ocasiones, me gustaría que el servicio en segundo plano detenga su procesamiento e invoque un diálogo de una clase de presentador para que el usuario lo ingrese. La entrada del usuario se usaría para agregar una fila maestra en la base de datos, después de lo cual el servicio en segundo plano debería reanudarse desde donde había quedado (no desde el principio del archivo csv, sino desde la fila que causó el error).
¿Es posible lograr esto en JavaFX, quizás con la API javafx.concurrent? ¿Cómo voy a hacer esto?
Solución
Cuando el proceso en segundo plano encuentre una situación en la que se requiera la intervención de un usuario, utilice FutureTask ejecutado en Platform.runLater para mostrar y mantener la solicitud de diálogo en el hilo de la aplicación JavaFX. En el proceso de fondo use futureTask.get para pausar el proceso de fondo hasta que el usuario haya ingresado los valores necesarios que permitirán que el proceso continúe.
Fragmento de código de muestra
Aquí está la esencia del código para este enfoque que se puede colocar dentro del método de llamada de su proceso de fondo:
String nextText = readLineFromSource();
if ("MISSING".equals(nextText)) {
updateMessage("Prompting for missing text");
FutureTask<String> futureTask = new FutureTask(
new MissingTextPrompt()
);
Platform.runLater(futureTask);
nextText = futureTask.get();
}
...
class MissingTextPrompt implements Callable<String> {
private TextField textField;
@Override public String call() throws Exception {
final Stage dialog = new Stage();
dialog.setScene(createDialogScene());
dialog.showAndWait();
return textField.getText();
}
...
}
Solicitud de muestra
Creé una pequeña y completa aplicación de muestra para demostrar este enfoque.
El resultado de la aplicación de muestra es:
Explicación de salida de muestra
Las líneas leídas sin valores faltantes son simplemente marrones. Las líneas con un valor rápido ingresado tienen un fondo verde pálido. Se han leído catorce líneas, la tarea de fondo ya se detuvo una vez en la 6ª línea que le faltaba un valor. Se xyzzy
al usuario el valor faltante (al que el usuario ingresó xyzzy
), luego el proceso continuó hasta la línea 14 que también falta y la tarea de fondo se pausa nuevamente y se muestra otro cuadro de diálogo de solicitud.