TRATAR AO PARAR UMA THREAD

 Tópico anterior Próximo tópico Novo tópico

TRATAR AO PARAR UMA THREAD

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#479331 - 26/01/2018 22:14:34

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Programação assíncrona não significa simplesmente enfiar tudo numa thread, a coisa é muito mais complicada. Veja bem, hoje, o .NET Framework já dispõe de métodos assíncronos, inclusive para o ADO.NET em vários connectors(para banco de dados SQL Server, MySQL e Oracle, tenho certeza que possuem, para outros bancos não sei dizer). Se seu objetivo é disparar uma tarefa(como gravar dados no banco) e ter o fluxo livre(que é o princípio de programação assíncrona), você vai precisar de bem mais do que simplesmente instanciar uma thread e colocar sua tarefa nela, ainda mais em se tratando de windows forms, que são muito bem conhecidos por não serem thread-safe.

Por favor, explique o que exatamente quer fazer, qual banco de dados e connector que está usando, assim, posso pensar em algo aqui para te dar uma ajuda.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#479332 - 26/01/2018 23:11:22

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
:
Programação assíncrona não significa simplesmente enfiar tudo numa thread, a coisa é muito mais complicada. Veja bem, hoje, o .NET Framework já dispõe de métodos assíncronos, inclusive para o ADO.NET em vários connectors(para banco de dados SQL Server, MySQL e Oracle, tenho certeza que possuem, para outros bancos não sei dizer). Se seu objetivo é disparar uma tarefa(como gravar dados no banco) e ter o fluxo livre(que é o princípio de programação assíncrona), você vai precisar de bem mais do que simplesmente instanciar uma thread e colocar sua tarefa nela, ainda mais em se tratando de windows forms, que são muito bem conhecidos por não serem thread-safe.

Por favor, explique o que exatamente quer fazer, qual banco de dados e connector que está usando, assim, posso pensar em algo aqui para te dar uma ajuda.


show de bola kerplunk. então vamos la...

eu tenho 3 Formulários.
*Form Cadastro de Notas Fiscais
*Form "Aguarde" (onde eu deixei uns nomes e coloquei um Gif que fica Girando, para o operador aguardar que esta sendo finalizado)
*Form de Forma de pagamento, que é onde vai ser finalizado as formas de pagamentos do cadastro das notas fiscais..

Qnd o Operador apertar a tecla [F5] vai chamar o metodo para abrir a tela de aguarde, e vai entrar no INSERT, e UPDATE. são 3 INSERT em 3 tabelas , e um UPDATE. dai dependendo se for muitos Itens, demora um pouquinho sabe ?, dai justamente essa tela de "AGUARDE" seria para o operador ter paciência aguardar, e não ter q ficar clicando em algo na tela.
  clsAguarde.IniciaProcesso()


Blz. chamou  tranquilo. qnd terminar os INSERT e UPDATE.. dai
vai entrar no processo de Parar a THREAD
clsAguarde.ParaProcesso()

Após parar vai fechar a tela de "Aguarde",e vai abrir a tela de "Forma de pagamento"  pronto é essa logica que quero fazer.
----
   Public Sub IniciaProcesso()
        th = New Thread(New ThreadStart(AddressOf MostraProceso))
        th.IsBackground = True
        th.Name = "Aguarde"
        th.Start()
    End Sub
-----
Public Sub ParaProcesso()
        Thread.Sleep(50)
        th.Abort()
        th = Nothing

    End Sub

Private Shadows Sub MostraProceso()
        Dim sForm As New Aguardar_Impressao()
        sForm.ShowDialog()
    End Sub




#479335 - 26/01/2018 23:36:46

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Essa parte, o que está no formulário é bem fácil de entender, até porque dá pra ver no stack do seu erro. O que queria ver é a parte onde faz a gravação em si. É ela que vai sofrer as mudanças. Se você estiver usando OOP já vai ser meio caminho andado, senão, a coisa vai complicar pra você.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#479336 - 26/01/2018 23:45:39

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
:
Essa parte, o que está no formulário é bem fácil de entender, até porque dá pra ver no stack do seu erro. O que queria ver é a parte onde faz a gravação em si. É ela que vai sofrer as mudanças. Se você estiver usando OOP já vai ser meio caminho andado, senão, a coisa vai complicar pra você.


esta assim.

   clsAguarde.IniciaProcesso_Tela_Compras()
            P_Concluir_Compra() ' AQUI TEM OS INSERT E UPDATE

            FatorConver_Nulo = ""
            LimpaCamposFornecedor()
            LimpaCamposProdutos()
            Limpa_Campos_Valores()
            'DtG_Duplicatas_Compras.Rows.Clear()
            'Me.Close()

            Application.DoEvents()
            clsAguarde.ParaProcesso()
            Application.DoEvents()
            Application.DoEvents()

            Compra_NFe_Desdobramento.Show()


   PGravaCompra() 'grava os dados da compra tbl - Compras   OK FUNCIONANDO
            Acumula_Bonifi()
            Acumula_Tribut() 'acumula valor Tributado
            Acumula_Substi() 'acumula valor Substituição
            System.Threading.Thread.Sleep(2000) '2000
            Grava_Tribu_Subst() 'Grava Tributado e Substituição
            Deleta_Download_Concluido()
            GravaItensCompras() 'Grava os Itens a compra e os demais
            UpdateNoEstoque() ' Faz o Update no estoque.  
            UpdateNoEstoque_NaoFiscal() 'estoque Nao Fiscal
            Update_Valores_Produto()  'Faz o Update dos valores do produto, p_compra, venda, custo, .marg. promo.

            passarDados_Finalizar() 'passa os Dados para finalizar
            Passar_Duplicatas()

            CarregaNumeracaoCadastroCompra()
            Me.mkbDataEntrada.Text = DateValue(agora)
            txtNumeroNFE.Focus()




#479337 - 26/01/2018 23:49:39

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
PGravaCompra() 'grava os dados da compra tbl - Compras   OK FUNCIONANDO
            Acumula_Bonifi()
            Acumula_Tribut() 'acumula valor Tributado
            Acumula_Substi() 'acumula valor Substituição
            System.Threading.Thread.Sleep(2000) '2000
            Grava_Tribu_Subst() 'Grava Tributado e Substituição
            Deleta_Download_Concluido()
            GravaItensCompras() 'Grava os Itens a compra e os demais
            UpdateNoEstoque() ' Faz o Update no estoque.  
            UpdateNoEstoque_NaoFiscal() 'estoque Nao Fiscal
            Update_Valores_Produto()  'Faz o Update dos valores do produto, p_compra, venda, custo, .marg. promo.

            passarDados_Finalizar() 'passa os Dados para finalizar
            Passar_Duplicatas()

            CarregaNumeracaoCadastroCompra()
            Me.mkbDataEntrada.Text = DateValue(agora)
            txtNumeroNFE.Focus()  


Essas funções estão são chamados por :::>>>  P_Concluir_Compra() ' AQUI TEM OS INSERT E UPDATE



#479338 - 27/01/2018 00:34:33

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Amigo, não leve à mal, mas sua aplicação está bastante "capenga" no que diz respeito à estruturação. Não sei se do jeito que está você vai conseguir fazer chamadas assíncronas para o banco. Mas enfim, aqui tem um bom artigo sobre isso. Mas não só baixe o código, tente entender como funciona e PRINCIPALMENTE para seu próprio bem, atual e futuro, comece o quanto antes à usar OOP.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#479339 - 27/01/2018 09:58:10

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Citação:
  CheckForIllegalCrossThreadCalls = False
??

Não se deve utilizar este comando com threads, o ideal é utilizar delegates nos objetos, este comando "esconde" o problema, e no futuro vai ser pior (experiência própria).




#479340 - 27/01/2018 15:06:43

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
:
  CheckForIllegalCrossThreadCalls = False  ??

Não se deve utilizar este comando com threads, o ideal é utilizar delegates nos objetos, este comando "esconde" o problema, e no futuro vai ser pior (experiência própria).


GUIMORAES, vc fez alguma solução para tratar esse Erro que as vezes aparece ?




Resposta escolhida #479341 - 27/01/2018 15:17:18

DS2T
BARRA MANSA
Cadast. em:Novembro/2010


Rápida e superficial explicação sobre Threads no Windows Form:

Quando você cria um formulário, um usercontrol ou utiliza um componente, todos esses caras ficam na thread principal da sua aplicação. Ou seja, toda sua UI fica nessa thread principal.
Como o Kerplunk falou, eles não são thread-safe. Ou seja, você apenas pode acessar os seus controles e formulários na thread principal.

Se você está rodando alguma coisa numa thread secundária e quer atualizar algo na tela, você terá que sair da thread secundária para poder atualizar sua UI.
Existem algumas formas de tratar isso, mas os preferidos do pessoal são: Usar um background worker para abstrair a complexidade ou então usar a propriedade InvokeRequired  com o método Invoke (obrigando a chamar na thread onde o objeto foi criado).

Esse artigo te ajudará um bocado:

https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls


Lembrando ainda que quando você cria uma Thread dessa forma (Thread.Start) você está criando uma nova thread, mesmo que já tenha uma pronta para ser usada. Por isso o .NET implementou o conceito de Tasks, que calcula o que é mais vantajoso: Criar uma nova Thread ou utilizar uma ociosa.

Outra observação: O Thread.Abort não vai necessariamente matar sua Thread. Ela pode continuar rodando por tempo indeterminado. O ideal é você ter variáveis de controle e controlar a concorrência com interlock, lock, monitor, semaphore, mutex, etc...


Thread é um assunto complexo e bem extenso, que eu particularmente, sei apenas o básico para fazer uma concorrência.

Fico a disposição para qualquer dúvida.

"Cansei de frases intelectuais" - Eu mesmo


#479343 - 27/01/2018 15:35:15

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
:
Rápida e superficial explicação sobre Threads no Windows Form:

Quando você cria um formulário, um usercontrol ou utiliza um componente, todos esses caras ficam na thread principal da sua aplicação. Ou seja, toda sua UI fica nessa thread principal.
Como o Kerplunk falou, eles não são thread-safe. Ou seja, você apenas pode acessar os seus controles e formulários na thread principal.

Se você está rodando alguma coisa numa thread secundária e quer atualizar algo na tela, você terá que sair da thread secundária para poder atualizar sua UI.
Existem algumas formas de tratar isso, mas os preferidos do pessoal são: Usar um background worker para abstrair a complexidade ou então usar a propriedade InvokeRequired  com o método Invoke (obrigando a chamar na thread onde o objeto foi criado).

Esse artigo te ajudará um bocado:

https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls


Lembrando ainda que quando você cria uma Thread dessa forma (Thread.Start) você está criando uma nova thread, mesmo que já tenha uma pronta para ser usada. Por isso o .NET implementou o conceito de Tasks, que calcula o que é mais vantajoso: Criar uma nova Thread ou utilizar uma ociosa.

Outra observação: O Thread.Abort não vai necessariamente matar sua Thread. Ela pode continuar rodando por tempo indeterminado. O ideal é você ter variáveis de controle e controlar a concorrência com interlock, lock, monitor, semaphore, mutex, etc...


Thread é um assunto complexo e bem extenso, que eu particularmente, sei apenas o básico para fazer uma concorrência.

Fico a disposição para qualquer dúvida.


Minha nosssa, numa simples tela usando o Thread. não sabia que seria um imenso trabalho :( to ate pensando em desistir e tirar essa tela de Aguarde... realmente é bem complexo, e não conseguirei criar tudo isso.



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por JOHNSTEVE em 27/01/2018 16:58:04