Controle de trabalho usando threads
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 SubEnd Class
Discussão (0)
Carregando comentários...