Saudações a todos.
Bom, já pesquisei bastante na internet, inclusive aqui no fórum, porém não encontrei nenhuma solução para o meu problema.
É o seguinte: Estou desenvolvendo um plugin para o Eclipse e em uma das views desse plugin eu preciso que uma Thread, que fica ouvindo uma porta a todo tempo, altere, sempre que preciso, o conteúdo de um Text Field. Beleza, escrevi as rotinas, validei o funcionamento das outras ações, porém, na hora de alterar o Text Field recebo a seguinte mensagem de erro: "Invalid thread access"
Já vi que isso se deve a uma “trava” do Java para que não haja acesso concorrente e tal, já tentei usar o Display.getDefault().asyncExec passando minha Thread e nada.
Para testar já fiz até o seguinte e não funcionou (Inclusive não entendi porque travou já que é assincrono):
Você não entendeu para que serve o asyncExec. Ele serve para você executar um trecho de código na thread do SWT. Quando você fez isso (criar uma thread dentro do asyncExec) você violou a concepção do asyncExec, já que o trecho de código dentro da thread não está executando dentro da thread do SWT.
Você teria de fazer algo diferente (ou seja, o que costumo chamar de “pensar do avesso”), que seria algo como:
inti;// variável de instância, não variável local...while(true){Thread.sleep(1000);Display.getDefault().asyncExec(newRunnable(){@Overridepublicvoidrun(){lblStartPrivateChat.setText(String.valueOf(i));i++;}});}
MLessa
Ok, talvez eu realmente não tenha entendido o funcionamento do asyncExec mesmo, porém essa solução que vc me passou também não resolve o problema porque a linha de execução fica presa no while e a tela nem termina de carregar, trava tudo!
E agora, mais alguma luz??
E
entanglement
De qualquer maneira, fica a lição: asyncExec serve para forçar que o código dentro do “run” seja executado na thread da GUI (no seu caso, o SWT). Você deve imaginar uma forma (provavelmente sem um loop infinito) para tratar o que você tem de fazer.
Não se esqueça: se algo não dá certo do jeito que você está forçando a barra, pense AO CONTRÁRIO.
MLessa
Ok, entanglement, muito obrigado pelas dicas!
Vou ver o que eu consigo fazer aqui. Se vc tiver alguma idéia eu ficaria feliz em saber =D
Brigadão!
MLessa
Pensei “ao contrário” e me saiu essa solução:
Runnablea=newRunnable(){@Overridepublicvoidrun(){try{Thread.sleep(200);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}lblStartPrivateChat.setText(String.valueOf(i));i++;Display.getCurrent().asyncExec(this);}};Display.getCurrent().asyncExec(a);
Funciona, mas o sleep, como ta rodando dentro da thread do swt, acaba gerando um atraso na gui prejudicando a escrita nos campos de texto, mudança de foco e etc.
Mais alguma dica?
E
entanglement
Ainda estou achando estranho (nunca vi esse tipo de coisa, usar asyncExec (this). )
Ainda acho que é forçar a barra demais
E
entanglement
Você deve ter entendido que se você precisa de um Thread.sleep, provavelmente está fazendo alguma coisa errada.
O que você provavelmente precisa é de um java.util.Timer mesmo
MLessa
É, o pior é que eu não tenho muito jeito. Preciso ficar a do tempo escutando uma porta e quando vier alguma coisa preciso colocar o conteúdo no textField.
Vou tentar algo com métodos synchronized ou declarar o textField como volatil (dicas de um colega). Se der certo posto aqui
MLessa
Isso que eu postei com o Thread.sleep foi só um exemplo, não o meu problema de verdade (que não postei devido o tamanho). Nele, não tenho um sleep e sim um loop infinito.
Ok, não coloquei um exemplo muito bom… :S
MLessa
Mais ninguém no fórum tem alguma sugestão?? O problema ainda persiste e eu sinceramente não sei mais o que fazer