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 laumello12
      Galera ajudinha
      Como faço para consumir um web service pronto em um projeto. Preciso só que ele busque no web service e traga na web 
      HELP
    • By drapn
      Boa tarde pessoal
      Estou com um projeto em Vb.Net que consiste em importar dados de uma planilha de Excel para um Datagridview.
      O projeto esta funcionando tudo ok porem notei que quando vou movendo as barras laterais e inferiores o formulário apresenta grande lentidão para mover as colunas etc...
      Fiz o teste criando um projeto novo com somente 1 Form, 1 Datagrid e 1Botão e os códigos para fazer a importação e quando eu "populo" o datagridview com o conteudo ele apresenta esses legs.
       
      Alguem a ja passou por isso?
      Será que é configuração da máquina? (Não é uma máquina tão fraca)
      O Vb.NET é a versão 2015
       
       
      Os arquivos de Excel variam de 80 Linhas por 5 Colunas á 400 linhas e 5 colunas
       
      O código é esse:
       
      Sub ImportaEstoque()         Dim Local         Local = EndArquivo()         If String.IsNullOrWhiteSpace(Local) Then             MessageBox.Show("Nenhum arquivo foi selecionado.", "Informação.", MessageBoxButtons.OK, MessageBoxIcon.Information)             Return         End If         '------------------------------         Dim caminhoArquivoExcel As String = Local         Dim nomePlanilhaExcel As String = "ESTQ" & "$"         Dim conexaoOleDb As OleDbConnection = Nothing         Dim ds As DataSet         Dim cmd As OleDbDataAdapter         '------------------------------         Try             'conexaoOleDb = New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Local & ";Extended Properties=Excel 8.0;")             conexaoOleDb = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & Local & ";Extended Properties='Excel 8.0;HDR=Yes'")             'cmd = New OleDbDataAdapter("Select * from [" & nomePlanilhaExcel & "]", conexaoOleDb)             cmd = New OleDbDataAdapter("Select * from [" & nomePlanilhaExcel & "]  Where UM Like '%" & "PC" & "%'", conexaoOleDb)             cmd.TableMappings.Add("Table", "tabelaExcel")             ds = New DataSet             cmd.Fill(ds)             dgvDados.DataSource = ds.Tables(0)         Catch ex As Exception             MessageBox.Show(ex.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)         Finally             conexaoOleDb.Close()         End Try         sbQtdItens.Text = "Encontrados " & dgvDados.RowCount.ToString & " itens."     End Sub  
       
       
      Pessoal desde já muito obrigado pela força!
    • By eduardohaag
      Olá estou criando um sistema onde preciso calcular a previsão de envio do pedido em dias uteis, para isso estou usando um webservice gratuito que retorna um xml, porém estou tendo o erroSystem.XML.XmlException: 'Dados no nível raiz inválidos. Linha 1, posição 1.'
       
      Meu código é 
      Sub Preenchedata() Dim sql = "SELECT PrazoPadraoProducao FROM Configuracoes" Dim dr As DataTable = AcessoDB.ExecutarComando(sql, CommandType.Text, Nothing, AcessoDB.TipoDeComando.ExecuteDataTable) Dim ds As New DataSet Dim xml As String = "https://elekto.com.br/api/Calendars/br-BC/Add?initialDate=" & Now.Year & "-" & Now.Month & "-" & Now.Day & "&days=" & dr.Rows(0).Item(0) & "&type=work" ds.ReadXml(xml)  
      e o xml retornado é 
       
      <dateTime xmlns="http://schemas.microsoft.com/2003/10/Serialization/">2019-05-03T00:00:00Z</dateTime>  
      Alguém tem alguma ideia de como posso eliminar o erro?
    • By lindomar55
      ola amigos preciso de uma ajudinha, estou montando uma aplicaçao usando vb.net windows forms. nela tenho um botao onde chamo uma url no chrome com o seguinte comando.
      Private Sub Btn_abrir_site_Click(sender As Object, e As EventArgs) Handles Btn_abrir_site.Click
              Dim url As String = “https://www.rico.com.você/dashboard/tesouro-direto/“
              Process.Start(url)
          End Sub
      no google entao eu acesso com meu logim manualmente(prefiro assim). e em realizo uma serie de operaçoes, chega um determinado momento que preciso passar passar os dados que o site me apresenta entao(apos as operaçoes) para o aplicativo. ai é que esta o problema. neste ponto estou boiando.
      no codigo abaixo por exemplo: precisava obter os valores 12,36 e 8806,84 de forma automatica e colocar em textbox.
      vi exemplos na net que mostram com webbrowser porem eu prefiro que seja com o chrome. e nesses exemplos ele abre a pagina e ja obtem os dados. eu preciso trabalhar na pagina muiiiito e so depois baixar os dados programaticamente.
      qualquer ajuda sera bem vinda....
       

    • By Maicon Santos
      Foi me passada a tarefa de fazer um sistema onde o usuário (funcionário 1) (Funcionário da empresa X) irá fazer um cadastro com suas informações, após esse cadastro essas informações serão avaliadas por outro funcionário (funcionário 2) da empresa X que fica responsável apenas por verificar as informações desse usuário e dar permissões a ele. Até então é um sistema simples de cadastro.
      Após o funcionário 1 fazer o cadastro o funcionário 2 avaliará essas informações para ver se esse usuário pode ter acesso a conta bancária da empresa. (Pera! Como assim?) Exatamente isso, o usuário vai se cadastrar e se ele for apto a acessar a conta bancária da empresa o sistema terá que fazer o login na conta bancária da empresa, ou seja o sistema deve apenas verificar os dados do funcionário 1, se ele for apto abrir a conta da empresa o sistema terá que passar os dados pelo internet banking do Santander.
       
      Um outro exemplo que talvez facilite entender:
      Os funcionários 1, 2 e 3 trabalham juntos gerenciando as finanças da empresa, então todos eles precisam acessar a conta bancaria da empresa, mas o gerente para não ter que passar o login e senha para eles quer que o sistema faça esse login, sem que os funcionários saibam esses devidos dados, então os funcionários farão um cadastro no sistema e após fazer o login no mesmo eles automaticamente fazem o login na conta do Santander da empresa
       
      Basicamente isso, minhas dúvidas até o momento:
      Isso é realmente possível? Fazer o login no internet banking, que tem a função de ser muito seguro, através de um outro sistema
      Eu tenho a disponibilidade para escolher entre fazer um sistema desktop (usando C#, que eu tenho mais domínio) ou fazer um sistema WEB (que eu não possuo tanto domínio assim das linguagens), para fazer esse tipo de trabalho, o que seria mais indicado?
      Quais dicas vocês podem me dar para essa tarefa? Eu trabalho na área de desenvolvimento a pouco tempo, por isso não tenho muito conhecimento de sistemas desse nível, qualquer direção será de grande ajuda.
      Grato!
×

Important Information

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