Sincronização de Processos

Estou com uma dúvida, a aplicação que estou desenvolvendo é para fazer a comunicação com uma balança digital da Toledo, ela faz a comunicação com a dll da balança. Seguinte ao executar o código da aplicação ele me retorna um valor ret = 999 que na aplicação “Indica que não conseguiu detectar a hardkey local ou de rede”, e ao executar a aplicação passo a passo (debug) ela me retorna ret = 0 “Indica que a leitura foi válida”. Preciso sincronizar os processos dentro do arquivo, só que não entendi muito bem como fazer isto, pois procurei material sobre sincronização e nenhum deles mostrava como fazer isto dentro de um “public static void main(String[] args) {“, sempre que tento colocar um synchronizer(this) no programa, ele acusa que no static não posso ter o (this), agradeço se alguém puder me dar uma ajuda. Segue o código:

package toledo.cliente;

 

import ezjcom.JComException;

 

public class ClienteBalanca {

 

    public static void main(String[] args) {

        COMBalanca balanca = null;

        try {            

            balanca = new COMBalanca();

            balanca.__JComInitialize();

            _COMBalanca _balanca = balanca.get_COMBalanca();

            int t = _balanca.COM_W9091Serial(1);

            

            if (t < 0){

                System.out.println("AH!!!");

            }

            

            

            

            if (_balanca.COM_Select_Canal(t) != 0){

                int ret = _balanca.COM_Update_Canal(t);

                System.out.println("ret = " + ret);

                if (ret == 0){

                    String peso_bruto = _balanca.COM_Gross_Canal(t);

                    System.out.println("Bruto: " + peso_bruto);

                    String peso_tara = _balanca.COM_Gross_Canal(t);

                    System.out.println("Tara: " + peso_tara);

                    String peso_liq = _balanca.COM_Gross_Canal(t);

                    System.out.println("Liquido: " + peso_liq);

                    

                    String estadoMovimento = _balanca.COM_Estado_EmMovimento(t);

                    System.out.println("Estado Movimento: " + estadoMovimento);

                    String estadoCanal = _balanca.COM_Estado_Canal(t);

                    System.out.println("Estado Canal: " + estadoCanal);

                    

                }

            }

            _balanca.COM_Close_Canal(t);

        }catch (JComException e) {

            e.printStackTrace();

        }

    }

}

Você não pode usar a palavra-chave this dentro de um bloco estático, pois nesse caso não há um objeto atual para o qual essa palavra possa apontar. Você pode tentar criar um objeto estático e usar esse objeto como lock ao invés do this.

Na boa, não faça isso, não coloque todo o seu código dentro do main(), isso me lembra quando eu programava em C… :wink:
Só para funcionar o syncronized(this) crie um outro método não static que tenha essa sua lógica com o syncronized. No método main vc cria uma instância da sua classe e chama esse método. Pronto, vai funcionar…
Quando você usa o this, você está passando uma referência da instância atual. Só que com métodos static você não necessariamente possui uma instância.

Abraços

Acho que não é nem que tudo esteja sendo feito em main, este motne de System.ou.println() deve sair, mas mesmo assim você, na hroa de prograamr a aplicação em si, deve prestar atenção nas suas classes e na coesão dos seus métodos.

Ah, e pelo amor de Zenon, use as convenções de nomenclatura da linguagem

Mesmo em linguagens estruturadas a coesão de uma funçãod eve ser respeitada :wink:

[]s

code:

[quote]Só para funcionar o syncronized(this) crie um outro método não static que tenha essa sua lógica com o syncronized. No método main vc cria uma instância da sua classe e chama esse método. Pronto, vai funcionar…
[/quote]

Não entendi muito bem como fazer isto, gostaria de que se possível alguém me indicasse um exemplo prático ou onde posso encontrar algo que demonstre isto.

Um exemplo meio idiota pq só vai ter uma thread chamando o método… Mas que exemplifica o que eu falei…

[code]public class Sync1 {
public void metodo() {
// Faz alguma coisa
synchronized(this) {
// Faça alguma coisa sincronizada
}
// Faça outra coisa
}

public static void main(String[] args) {
Sync1 sync1 = new Sync1();
sync1.metodo();
}
}[/code]

Mas sugiro dar uma boa estudada no assunto…
Pode começar por aqui:
http://java.sun.com/docs/books/tutorial/essential/threads/multithreaded.html

Valeu a dica code, vou dar uma estudada. Obrigado!