java - JavaFx 2 application freezing when running task -


i'm new in javafx 2 , i'm having troubles using multithreads in javafx. problem i'm facing application freezes , can't find why. believe there race condition in place, can't locate it. javafx's documentation says, i've created class extending "service" , i'm running "start()":

public class processadortarefas extends service<statusretorno>{      private final itarefa tarefapadrao=new tarefaverificarimpressora();     private final itarefa tarefa;     protected logger logger = loggerfactory.getlogger(this.getclass());      public processadortarefas(itarefa tarefa) {         this.tarefa = tarefa;     }      public void processar() {         if(getstate()==state.ready)             start();         else             restart();     }      @override     protected task<statusretorno> createtask() {         return new task<statusretorno>() {             @override             protected statusretorno call() throws exception {                      /*the code freezes here*/                  statusretorno status = tarefapadrao.processar();                 if (status == statusretorno.sucesso)                     status = tarefa.processar();                 return status;             }         };     } } 

the class calls "processar" method listen onsuceed, oncancelled , onfailed of processadortarefas class:

public abstract class controladorbase implements iprocessamentodispatcher, eventhandler<workerstateevent> {      @autowired     protected controladordialogomensagem dialogomensagem;     protected itarefa tarefa;     protected string mensagem;     protected set<iprocessamentolistener> listeners = new concurrentskiplistset<iprocessamentolistener>();      protected void executartarefa(itarefa tarefa) {         executartarefa(tarefa, null);     }      protected void executartarefa(itarefa tarefa, string mensagem) {         this.tarefa=tarefa;         this.mensagem=mensagem;         despacharprocessamento(statusprocessamento.iniciado, null);         final processadortarefas processador=new processadortarefas(tarefa);         processador.setonsucceeded(this);         processador.setoncancelled(this);         processador.setonfailed(this);         processador.processar();     }      @override     public void handle(workerstateevent evento) {         statusretorno status= (statusretorno) evento.getsource().getvalue();         despacharprocessamento(statusprocessamento.finalizado,status);         if(status==statusretorno.sucesso)             exibirmensagemsucesso();         else             exibirmensagemerro(status);     }      /*unimportant code*/      private void despacharprocessamento(statusprocessamento statusprocessamento, statusretorno statusretorno) {         (iprocessamentolistener listener : listeners)             listener.processamento(new eventoprocessamento(this, statusprocessamento,statusretorno));     }      /*add , remove listeners code*/ } 

as code freezes on "call" method, listener isn't called , main dialog isn't shown, cause code called after user logged in.

information added

code executed after login dialog closed , before main dialog opens, so, there isn't javafx element in screen:

public class app extends application implements idadossubmetidoslistener, iprocessamentolistener {      /*variable declaration ommited*/         public static void main(string args[]) {         launch(args);     }      @override     public void start(stage stage) throws exception {         applicationcontext contexto = new classpathxmlapplicationcontext("/spring/appcontext.xml");         app aplicacao = contexto.getbean(app.class);         securitycontextholder.setstrategyname(securitycontextholder.mode_global);         aplicacao.iniciar();     }      private void iniciar() {         cancelaroperacoestef();         controladordialogologin.adicionarlistener(this);          /*opens login dialog*/          controladordialogologin.abrir();     }      private void verificardadoseabrirtelaprincipal() {          /*after user logged in, close login dialog*/          controladordialogologin.limparlisteners();         controladordialogologin.fechar();         if (verificadorfuncaousuario.usuarioautorizado()) {             if (verificadorfuncaousuario.usuariocaixa())                 verificarseecfvalidoecadastrar();             else                 controladordialogoprincipal.abrir();         } else {             controladordialogomensagem.adicionarlistener(this);             controladordialogomensagem.exibiralerta("você não tem credenciais que te permitam acessar este sistema!");         }     }      private void verificarseecfvalidoecadastrar() {         verificadornumeroserieecf.adicionarlistener(this);          /*this code call class shown above*/          verificadornumeroserieecf.verificarnumeroserieecf();     }      private void terminarcadastroecfeabrirtelaprincipal() {         controladordialogocadastroecf.limparlisteners();         controladordialogocadastroecf.fechar();         controladordialogoprincipal.abrir();     } }  

as can see, code called in main thread, correct place call code, or should call dialog?

i didn't know service class works when called javafx component. so, solve adapted part of code run in single thread. in others parts of program, service started javafx's component (a button example) , works well.


Comments

Popular posts from this blog

ios - iPhone/iPad different view orientations in different views , and apple approval process -

java Extracting Zip file -

C# WinForm - loading screen -