Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Encadear eventos Threads Syncronized

Boa tarde,

Tenho uma dúvida, na verdade queria saber qual a melhor solução para o problema abaixo:

Em uma GUI, tenho dois eventos:

Evento 1 - no JCombobox - selecItem

private void portasCBActionPerformed(java.awt.event.ActionEvent evt) {                                              
        try {
            this.executa = this.conecta.conectaArduino(this.portasCB.getSelectedItem().toString());
        } catch (SerialPortException ex) {
            ex.printStackTrace();
        }
 }

Esse primeiro evento invoca um método que realiza a leitura de dados pela porta que foi passada. Gostaria que o método abaixo só fosse liberado para execução após o término da leitura, não quero que seja realizado paralelamente e gostaria que isso fosse forçado com um syncronized, porém não sei como aplicar. Alguém pode me ajudar?

Evento 2 - no JButton - actionPeformed

private void acenderBActionPerformed(java.awt.event.ActionEvent evt) {                                         
       try { 
            this.executa.escritaDigital((byte) 0x31));
       } catch (SerialPortException ex) {
            ex.printStackTrace();
       }
 }
5 respostas

Opa, acho que para responder melhor é importante saber o motivo da necessidade da trava. De todo jeito, vou dar minha sugestão:

private void portasCBActionPerformed(java.awt.event.ActionEvent evt) {                                              
        try {
            this.executa = this.conecta.conectaArduino(this.portasCB.getSelectedItem().toString());

acenderBActionPerformed(executa)


        } catch (SerialPortException ex) {
            ex.printStackTrace();
        }
 }


private void acenderBActionPerformed(NaoSeiOTIpo executa) {                                         
       try { 
            this.executa.escritaDigital((byte) 0x31));
       } catch (SerialPortException ex) {
            ex.printStackTrace();
       }
 }

Em vez de usar synchronized ou algo assim, trabalhe com variáveis locais e parâmetros. Dessa forma você não vai precisar se preocupar com concorrência.

Mas são dois eventos independentes na tela. Um é combobox e outro é um button. Não quero que o button execute antes do comando do combobox ser executado.

solução!

Eu não sei bem o caso, mas, seria possível você setar o button como disable até que o Combobox termine e no fim do Combobox você faria

button.enable = true

Vou tentar mas acho que não vai funcionar. Pedi uma ajuda para a Alura em relação como deveria usar o Synchronized nesse caso mas estão todos muito ocupados no momento. Grato de qualquer forma.

Ótimo, depois volte e dê um feedback pra nós a respeito. Gostaria de saber o resultado.