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
Post a Comment