none
Dúvida com thread RRS feed

  • Pergunta

  • Boas senhores,

    Tenho uma aplicação windows services...desenv. em c#

    Ela  roda uma thread que executa 2 funções a cada 10 minutos....

    controlo através  de loop como fragmento abaixo...

     protected override void OnStart(string[] args)
     {
        try
          {
           trdMain = new Thread(new ThreadStart(Processo));
                    trdMain.Start();
    ....
          }
          catch (Exception ex)
          {
            // trataerro;
          }
    }
    
    private void Processo()
            {
                while (true)
                {
    
                    //atividade 1 *
    
                    // Atividade 2  *
    
                 Thread.Sleep(10 * 60000);
                }
            }
    
    

    Agora preciso alterar para que cada atividade rode em tempos diferentes, ou seja, atividade 1 vai rodar a cada 10 minutos e atividade 2 a cada 50 minutos...

    é isso....alguém teria alguma orientação ?

    obrigado e t+

    terça-feira, 4 de setembro de 2012 17:53

Respostas

  • protected override void OnStart(string[] args)
     {
        try
          {
           trdMain = new Thread(new ThreadStart(Processo));
                    trdMain.Start();
    ....
          }
          catch (Exception ex)
          {
            // trataerro;
          }
    }
    
    private void Processo()
    {
                int count1=0;
                int count2=0;
                while (true)
                {
                       count1++;
                       count2++;
                       if(count1==100)
                           { Atividade1();count1=0;} 
                       if(count2==500)
                            {Atividade2();count2=0;}
                       Thread.Sleep(100);
                }
     }
    private void Atividade1()
    {}
    private void Atividade2()
    {}
    é um modo de se fazer... :P
    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:36
    terça-feira, 4 de setembro de 2012 18:27
  • Cara,

    Tente usar o System.Threading.Timer

    Timer thrdTimer = new Timer(execute, 10, 0, 1000);

     void execute(object args)
            {
                // cast our parameter 
                int j = (int)args;

                Console.WriteLine("passo aqui a cada " + j + "segundos");
            }

    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:35
    terça-feira, 4 de setembro de 2012 19:20
  • Os parametros que voce passa no construtor são:

     new Timer(nomedometodo,

                       argumento para o método,

                      passe 0 aqui,

    O intervalo de tempo entre as chamadas do método);

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace Foruns
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Timer thrdTimer = new Timer(run1,1,0,1000);
    
                Timer thrdTimer2 = new Timer(run2, 2, 0, 3000);
    
                Console.ReadLine();
            }
    
            static void run1(object args)
            {
                Console.WriteLine("Executando método 1");
            }
    
            static void run2(object args)
            {                        
                Console.WriteLine("Executando método 2");
            }
        }
    }



    Execute este console aplication para ver se fica mais fácil de entender...

    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:35
    quarta-feira, 5 de setembro de 2012 17:46
  • DET1,

    A respeito do que comentou sobre 2 threads com loop infinito, se você precisa verificar alguma variável fora da "tela" dentro de um intervalo de tempo não vejo outra maneira de fazer.

    Tudo depende de como você montou suas rotinas, se seu código está bem refatorado e otimizado, etc. Isso sim influencia na performance.

    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:35
    quarta-feira, 5 de setembro de 2012 19:36

Todas as Respostas

  • Por que simplesmente não adiciona um parâmetro no método? (ex: int intervalo).

    Ou cria uma segunda thread?

    terça-feira, 4 de setembro de 2012 18:00
  • protected override void OnStart(string[] args)
     {
        try
          {
           trdMain = new Thread(new ThreadStart(Processo));
                    trdMain.Start();
    ....
          }
          catch (Exception ex)
          {
            // trataerro;
          }
    }
    
    private void Processo()
    {
                int count1=0;
                int count2=0;
                while (true)
                {
                       count1++;
                       count2++;
                       if(count1==100)
                           { Atividade1();count1=0;} 
                       if(count2==500)
                            {Atividade2();count2=0;}
                       Thread.Sleep(100);
                }
     }
    private void Atividade1()
    {}
    private void Atividade2()
    {}
    é um modo de se fazer... :P
    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:36
    terça-feira, 4 de setembro de 2012 18:27
  • Obrigado pelo retorno....

    Mais um detalhe, preciso que rode em paralelo...se não fosse isso, o variável de controle serviria...

    Tem que ser em pararelo vou ter caso onde uma pode ultrapassar o tempo da outra na execução...terei intervalos menores...

    No caso de 2 thread, como ficaria  a sintaxe da chamada e o colotrole do loop ?

    Seria 

    trdMain1 = new Thread(new ThreadStart(atividade1)); trdMain1.Start();

    trdMain2 = new Thread(new ThreadStart(atividade2));

    trdMain2.Start();

    O loop, seria um em cada atividade? seria correto?

    terça-feira, 4 de setembro de 2012 18:56
  • Cara,

    Tente usar o System.Threading.Timer

    Timer thrdTimer = new Timer(execute, 10, 0, 1000);

     void execute(object args)
            {
                // cast our parameter 
                int j = (int)args;

                Console.WriteLine("passo aqui a cada " + j + "segundos");
            }

    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:35
    terça-feira, 4 de setembro de 2012 19:20
  • Se usar 2 threads sim.

    Elas trabalhariam independentemente, você forneceria por parâmetro o intervalo e XABLAU a mágica está feita.. .:D

    terça-feira, 4 de setembro de 2012 19:58
  • Senhores fiz então  desta forma , como no exemplo que dei, quebrei as atividades em 2 th e o método coloquei dentro de um loop infinito...

    Agora uma dúvida, isto é uma boa pratica ? 

    Outra coisa, vou estudar sobre o comando que o Willian informou...pra adiantar Willian, não entendi  como ficar em loop ou seja executar a cada determina tempo ?  

    Valeu....


    • Editado DET1 quarta-feira, 5 de setembro de 2012 16:20
    quarta-feira, 5 de setembro de 2012 16:19
  • Os parametros que voce passa no construtor são:

     new Timer(nomedometodo,

                       argumento para o método,

                      passe 0 aqui,

    O intervalo de tempo entre as chamadas do método);

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace Foruns
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Timer thrdTimer = new Timer(run1,1,0,1000);
    
                Timer thrdTimer2 = new Timer(run2, 2, 0, 3000);
    
                Console.ReadLine();
            }
    
            static void run1(object args)
            {
                Console.WriteLine("Executando método 1");
            }
    
            static void run2(object args)
            {                        
                Console.WriteLine("Executando método 2");
            }
        }
    }



    Execute este console aplication para ver se fica mais fácil de entender...

    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:35
    quarta-feira, 5 de setembro de 2012 17:46
  • Valeu meu caro, vou fazer o teste

    Obrigado

    quarta-feira, 5 de setembro de 2012 19:20
  • DET1,

    A respeito do que comentou sobre 2 threads com loop infinito, se você precisa verificar alguma variável fora da "tela" dentro de um intervalo de tempo não vejo outra maneira de fazer.

    Tudo depende de como você montou suas rotinas, se seu código está bem refatorado e otimizado, etc. Isso sim influencia na performance.

    • Marcado como Resposta DET1 quinta-feira, 6 de setembro de 2012 13:35
    quarta-feira, 5 de setembro de 2012 19:36
  • é um projeto windows services, que fica fazendo validações....

    São rotinas independentes, antes estava em um thread  e não havia problema, mas em um momento uma delas ficou processando a mais tempo e não era erro, dai a primeira ficou atrasada...

    Dai a necessidade de separar....

    quarta-feira, 5 de setembro de 2012 19:58