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

Como criar uma lista com resultados e separalos

Galera boa tarde,

Preciso apresentar o resultado de uma busca de itens em uma tela e separar por resultado 8040 e 0040.

Hoje eu clico em "read" e ele lê apenas uma vez, preciso criar uma rotina que ele fique lendo os resultados constantemente, separando os mesmos.

Como posso fazer isso? Abaixo o código atual:

 if (ChoseCard())
            {
                if ((this.tb_AddressValue.Text == "") || (this.tB_LengthOfWord.Text == ""))
                {
                    MessageBox.Show("Please write WordCount and Address", "ERROR");
                    return;
                }
                int area = 0;
                String s_addr = this.tb_AddressValue.Text;
                String s_count = this.tB_LengthOfWord.Text;
                short addr = System.Convert.ToInt16(s_addr);
                int count = System.Convert.ToInt32(s_count);

                if (this.cB_AreaToRW.Text == "RESERVED")
                {
                    area = 0;
                }
                if (this.cB_AreaToRW.Text == "EPC")
                {
                    area = 1;
                }
                if (this.cB_AreaToRW.Text == "TID")
                {
                    area = 2;
                }
                if (this.cB_AreaToRW.Text == "USER")
                {
                    area = 3;
                }
                byte[] ReadData = As3992Reader.ReadFromTag6C(area, addr, count);
                int read_retry = 0;

                while ((ReadData[0] != 0x00) && (read_retry < 10))
                {
                    ReadData = As3992Reader.ReadFromTag6C(area, addr, count);
                    read_retry++;
                }
                if (read_retry >= 9)
                {
                    MessageBox.Show("read fail......");
                    return;
                }
                byte[] show_data = new byte[ReadData.Length - 2];
                for (int j = 0; j < (ReadData.Length - 2); j++)
                {
                    show_data[j] = ReadData[j + 2];
                }
                String Tag_data = HexByteToString(show_data, 0, show_data.Length);
                this.tB_RW.Text = Tag_data;
                MessageBeep(1);
3 respostas

Olá Ricardo,

esse código tem muitas coisas específicas da sua regra de negócios e está um pouco complicado de entender o que ele está fazendo. Você pode explicar melhor qual parte você precisa que tenha o comportamento alterado e o quê você já tentou fazer?

Olá Alessandro,

Então na verdade o que preciso é só o final (código abaixo), como o código está no "for" ele sóé executado uma vez. preciso deixar ele executando e separando os resultados sendo 8040 do 0040.

Na aplicação clico em "Ler" e ele apresenta o resultado uma vez. O que preciso é implentar no código uma forma que ele inicie o for e só pare quando eu clicar em "parar" separando os resultados que ele encontrar.

Esse é um código de um leitor RFID, ele fica lendo etiquetas.

byte[] show_data = new byte[ReadData.Length - 2];
                for (int j = 0; j < (ReadData.Length - 2); j++)
                {
                    show_data[j] = ReadData[j + 2];
                }
                String Tag_data = HexByteToString(show_data, 0, show_data.Length);
                this.tB_RW.Text = Tag_data;
                MessageBeep(1);
solução!

Rotina... nos remete a processando em paralelo.

Processamento paralelo em ambiente desktop é um assunto tão amplo que tem livros e mais livros sobre isso.

Como o tópico está apenas C#, estou assumindo que vc está iniciando os estudos em C#, e por isso eu recomendo que vc continue acompanhando as aulas do curso, que em um dado momento esse tópico entrará em pauta.

Se quiser pesquisar na internet, use palavras chave como: "Thread safe", "Threading", "Multimultithread", "Timer", " async", "unmanaged resources"

Isso tudo junto com "C#"

"A calaboca cara, e me responde" - blz, calma véi!

Se estiver usando WPF: 'DispatcherTimer'

https://msdn.microsoft.com/pt-br/library/system.windows.threading.dispatchertimer(v=vs.110).aspx

using System.Windows.Threading:

var dispatcherTimer = new DispatcherTimer(DispatcherPriority.Background);
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0,0,1);  // 1 segundo
dispatcherTimer.Start();

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
     // rotina que fica lendo os resultados
}

Com WPF é bom saber como funciona o DispatcherPriority. Veja no link https://msdn.microsoft.com/pt-br/library/system.windows.threading.dispatcherpriority(v=vs.110).aspx

Se estiver usando WinForms: Timer

https://msdn.microsoft.com/pt-br/library/system.threading.timer(v=vs.110).aspx

using System.Timers;
using MyTimer = System.Timers.Timer;

public partial class Form1 : Form
{
    private readonly MyTimer timer = new MyTimer();
    private delegate void RotinaQueFicaLendoResultadosDelegate();

    public Form1()
    {
        InitializeComponent();

        timer.Tick += new EventHandler(timer_Tick);
        timer.Interval = 1000; // 1 segundo
        timer.Enabled = true;
        timer.Start(); 
    }

    private void RotinaQueFicaLendoResultados()
    {
        //  rotina que fica lendo os resultados
    }

    private void timer_Tick(object sender, FormClosingEventArgs e)
    {
        this.Invoke(
            new RotinaQueFicaLendoResultadosDelegate(
                this.RotinaQueFicaLendoResultados));
    }

    //  MUITO IMPORTANTE
    // Timer trabalha com recursos não gerenciados pela aplicação que está rodando 
    // (unmanaged resources), e precisa ser destruido (Dispose)
    //  No designer view vincule este método ao evento de FormClosing da sua janela
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        timer.Dispose();
    }
}