Jump to content
eduardohaag

Controle de trabalho usando threads

Recommended Posts

Olá,

Mais uma vez aqui estou eu com uma duvida que não estou conseguindo resolver.

Estou desenvolvendo um ERP para a grafica da minha esposa. Nesse sistema existe um modulo que registra o tempo trabalhado.

Para fazer isso existe um botão no formulário principal, que quando é clicado salva a hora na variável entrada, e quando clicado novamente ele registra no banco de dados o intervalo entre a entrada e saida.

Até ai tudo ok. Porém as vezes a pessoa sai e esquece de clicar para registrar a saida.

 

Então gostaria de fazer com que a cada 5 minutos fosse verificado se teve alteração na posição do ponteiro do mouse, porém permitindo que o usuário possa usar o programa.

 

Procurando na internet descobri que para isso o melhor seria usar uma thread para fazer essa verificação da posição do mouse em segundo plano já que seria executado a cada 5 minutos e dessa forma travaria a execução do form principal.

 

O problema está que quando ele detecta que mouse ficou parado por mais de 5 minutos e executa o codigo que salvo o intervalo no banco de dados acontece esse erro quando chega na linha "btEntrada.Text = "Registrar Entrada"" : "System.InvalidOperationException: 'Operação entre threads inválida: controle 'ToolStrip1' acessado de um thread que não é aquele no qual foi criado.'

 

Li que tenho que usar algo como invoke e delegate, mas mesmo estudando não consegui entender como implementar.

meu codigo é o seguinte:

 

Imports System.ComponentModel

Public Class Principal_content
    Dim saida As DateTime
    Dim tempo As TimeSpan
    Dim entrada As DateTime
    Dim ponteiro As Point
    
    Sub GerPonto()
        Do
            Threading.Thread.Sleep(5000)
            If ponteiro = Cursor.Position Then
                Call registraponto()
            End If
            ponteiro = Cursor.Position
        Loop
    End Sub
  
  

    Private Sub btEntrada_Click(sender As Object, e As EventArgs) Handles btEntrada.Click
        Call registraponto
    End Sub
  
  

    Sub registraponto()
        Dim trd = New Threading.Thread(AddressOf GerPonto)

        If btEntrada.Text = "Registrar Entrada" Then
            entrada = FormatDateTime(Now)
            btEntrada.Text = "Registrar Saida"
            btEntrada.ToolTipText = "Registrar Saida"
            btEntrada.Image = My.Resources.appointment_new_Ativo
            btEntrada.ForeColor = Color.Lime
            trd.Start()
        Else
            trd.Abort()

            saida = Now
            tempo = saida.Subtract(entrada)
            sql = "INSERT INTO ponto (Data, Entrada, Saida, Segundos) VALUES (#" & Format(entrada, "MM/dd/yyyy") & "#, #" & Format(entrada, "hh:mm:ss") & "#, #" & Format(saida, "hh:mm:ss") & "#, " & Replace(FormatNumber(tempo.TotalSeconds, 0, TriState.False, TriState.False, TriState.False), ",", ".") & ")"

            btEntrada.Text = "Registrar Entrada"
            btEntrada.Text = "Registrar Entrada"
            btEntrada.Image = My.Resources.appointment_new_desativo
            btEntrada.ForeColor = Color.Red

            AcessoDB.ExecutarComando(sql, CommandType.Text, Nothing, AcessoDB.TipoDeComando.ExecuteNonQuey)
        End If

    End Sub
End Class

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Roberto S. Santos
      Boa noite amigos programadores.
      Como posso salvar os dados do tracker.dat no MySQL ?
      Dados : textbox1.text
      Estou usando vb.net 
      Queria uma tabela no MySQL usando o Wamp .
      Poderiam me ajudar ?
      Obrigado.
    • By rl28
      Bom dia,
       
      Estou querendo ler todos arquivos que meu sistema gerou na minha máquina no formato .txt e carregar os mesmos em uma gridview, assim deixando apenas uma tela de consulta dos dados salvos nos arquivos txt, porém, meu código não está conseguindo consultar os arquivos, podem me ajudar?
       
      Obs.: Quando utilizo o nome fixo do arquivo, funciona.
       
      Código abaixo:

       
      Public Class formListaTransacao Private Sub formListaTransacao_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim dt As New DataTable dt.Columns.Add("Código") dt.Columns.Add("Descrição") dt.Columns.Add("Ação") Dim Arquivo As New System.IO.StreamReader("C:\Users\rl\Desktop\" & Me.Text & ".txt", System.Text.Encoding.Default) While Arquivo.Peek() <> -1 dt.Rows.Add(Arquivo.ReadLine()) End While DataGridView2.DataSource = dt End Sub  
      Tela do gridview:

       
      Informação que consta no txt e que deve carregar no gridview:
       
      Primeiro arquivo

       
      Segundo arquivo:

    • By luiz-om
      Estou começando a aprender c#, e estou com a seguinte duvida. Tenho as tabelas lote, leitura e consumo. A tabela leitura herda de lote o ID. um lote tem muitas leituras. E uma leitura tem um consumo.
      A real duvida e a seguinte: quando faço a inserção de uma leitura o consumo já é salvo automático, porém quero buscar a última leitura inserida com aquele ID fazer a subtração do número dela pra poder gerar o valor certo na tabela consumo. e não estou conseguindo fazer isso.
      [Table("Lote")] public class Lote { [Key] public int Id { get; set; } [Required] [MinLength(2, ErrorMessage ="O nome deve ter no minimo 2 caracters")] [MaxLength(140, ErrorMessage ="O nome pode ter no maximo 140 caracteres")] public string Proprietario { get; set; } public string CPF { get; set; } //Gera um checkbox public Boolean Socio { get; set; } public string Cavalete { get; set; } public virtual ICollection<Leitura> Leituras { get; set; } } [Table("Leitura")] public class Leitura { [Key] public int Id { get; set; } [ForeignKey("Lote")] public int LoteId { get; set; } public DateTime DataLeitura { get; set; } public int NumeroLeitura { get; set; } public virtual Lote Lote { get; set; } public virtual Consumo Consumo { get; set; } } public class Consumo { [Key, ForeignKey("Leitura")] public int Id { get; set; } public Double Valor { get; set; } public DateTime? DataPagamento { get; set; } public virtual Leitura Leitura { get; set; } } A parte de create da controller é essa
      [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "Id,LoteId,DataLeitura,NumeroLeitura")] Leitura leitura) { if (ModelState.IsValid) { //aki tudo que ja tentei /* * var leitura2 = from l in db.Leitura select l; leitura2 = leitura2.OrderByDescending(l => l.Id); db.Leitura.Where(l => l.LoteId == leitura.LoteId).OrderByDescending(l=> l.NumeroLeitura); // db.Leitura.leitura2.NumeroLeitura = db.Leitura.Where(l => l.LoteId == leitura.LoteId).FirstAsync; // db2.Leitura.Find(leitura2.LoteId).; var sql = db.Leitura.SqlQuery("select ID from Leitura Order by ID DESC;"); */ var consumo = new Consumo(); consumo.Leitura = leitura; //Essa parte que faz a conta apra salvar o consumo consumo.Valor =( leitura.NumeroLeitura) * 0.71; //quero fazer +- isso //consumo.Valor = (leitura.NumeroLeitura< <- ESSE SERIA O VALOR DA LEITURA ANTERIOR> - leitura.NumeroLeitura) * 0.71; db.Leitura.Add(leitura); db.Consumo.Add(consumo); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.LoteId = new SelectList(db.Lote, "Id", "CPF", leitura.LoteId); return View(leitura); }
    • By Neto Dinizz
      Olá bom dia,

      tenho um projeto MVC, preciso adicionar uma classe WCF e aproveitar as referencias já existente do entity, crei uma pasta e adicionei o serviço, Service.svc e IService.cs, o WCF alterou webconfig do projeto e parou de rodar, voltei o webconfig para o original, antes do de incluir a classe WCF, voltou a funcionar, porém o serviço WCF não funciona. Tenho algo para alterar no webconfig, para os dois rodarem juntos? Segue abaixo o código do webconfig alterado após incluir a classe WCF:

      <!-- //EXCLUÍDO AO ADICIONAR CLASSE WCF -->
      <system.webServer>
      <validation validateIntegratedModeConfiguration=false/>
      <modules>
      <remove name=ApplicationInsightsWebTracking/>
      <add name=ApplicationInsightsWebTracking type=Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web preCondition=managedHandler/>
      </modules>
      </system.webServer>
      <!-- //EXCLUÍDO AO ADICIONAR CLASSE WCF -->

      <!-- //INSERIDO AO ADICIONAR CLASSE WCF
      <system.serviceModel>
      <behaviors>
      <serviceBehaviors>
      <behavior name=>
      <serviceMetadata httpGetEnabled=true httpsGetEnabled=true />
      <serviceDebug includeExceptionDetailInFaults=false />
      </behavior>
      </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment aspNetCompatibilityEnabled=true
      multipleSiteBindingsEnabled=true />
      </system.serviceModel>
      -->

      Muito obrigado!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.