EXECUTAR PROCESSOS, PERMITE RESPOSTAS?
Bom dia, Pessoal!
Quando preciso executar uma função no VB.NET que tem de ser feita num processo a parte
faço o seguinte:
Dim NomeDoProcesso As New System.Threading.Thread(AddressOf NomeDaFuncao)
Para executar faço:
NomeDoProcesso.Start
Funciona muito bem.
Mas...
Agora necessito que depois do processo ser executado, eu saiba qual foi
o valor retornado pela função ao executada pelo processo.
É possível???
Quando preciso executar uma função no VB.NET que tem de ser feita num processo a parte
faço o seguinte:
Dim NomeDoProcesso As New System.Threading.Thread(AddressOf NomeDaFuncao)
Para executar faço:
NomeDoProcesso.Start
Funciona muito bem.
Mas...
Agora necessito que depois do processo ser executado, eu saiba qual foi
o valor retornado pela função ao executada pelo processo.
É possível???
Dim x = NomeDoProcesso.ExitCode
Kerplunk, muito obrigado pela resposta.
Mas, sem querer abusar.
Percebi agora que tenho um outro problema com esse processo:
hoje eu faço :
Dim NomeDoProcesso As New System.Threading.Thread(AddressOf NomeDaFuncao)
Para executar faço:
NomeDoProcesso.Start
Mas, percebi agora que a função que estou chamando com o processo , "tem argumentos" ( NomeDaFuncao(Par1,Par2,Par3)).
e o System.Threading.Thread(AddressOf NomeDaFuncao) não esta aceitando parâmetros no nome da função.
Algum colega, sabe como executar um processo, quando o método (Função) tem parâmetros????
Mas, sem querer abusar.
Percebi agora que tenho um outro problema com esse processo:
hoje eu faço :
Dim NomeDoProcesso As New System.Threading.Thread(AddressOf NomeDaFuncao)
Para executar faço:
NomeDoProcesso.Start
Mas, percebi agora que a função que estou chamando com o processo , "tem argumentos" ( NomeDaFuncao(Par1,Par2,Par3)).
e o System.Threading.Thread(AddressOf NomeDaFuncao) não esta aceitando parâmetros no nome da função.
Algum colega, sabe como executar um processo, quando o método (Função) tem parâmetros????
Eu tinha feito toda uma resposta explicando sobre Processos e Threads mas o site me deslogou e eu perdi a resposta e me recuso a reescrever tudo por causa de um site bugado, então vou resumir pois ainda tenho o código de exemplo que fiz como alternativa melhor que uso de Threads
Então resumindo, Processo não é Thread, você está usando Threads
Se está usando Threads está fazendo errado, no geral ninguém nunca deve usar Threads diretamente, existem alternativas que no final acabam usando Threads sem você precisar tocar nelas, uma delas é o uso de Task, que junto com Async/Await torna tudo mais simples, segue um exemplo com uso de Task e Async/Await para rodar algo demorado sem travar o programa, pra testar o exemplo crie um Form chamado Form1 e adicione dois Botões Button1 e Button2 e dois labels Label1 e Label2, clique no Botton2 que roda algo que leva 10 segundos pra executar, durante isso o Button1 ainda funciona sem problemas incrementando um valor e mostrando no Label1, no final dos 10 segundos aparece no Label2 o resultado
Então resumindo, Processo não é Thread, você está usando Threads
Se está usando Threads está fazendo errado, no geral ninguém nunca deve usar Threads diretamente, existem alternativas que no final acabam usando Threads sem você precisar tocar nelas, uma delas é o uso de Task, que junto com Async/Await torna tudo mais simples, segue um exemplo com uso de Task e Async/Await para rodar algo demorado sem travar o programa, pra testar o exemplo crie um Form chamado Form1 e adicione dois Botões Button1 e Button2 e dois labels Label1 e Label2, clique no Botton2 que roda algo que leva 10 segundos pra executar, durante isso o Button1 ainda funciona sem problemas incrementando um valor e mostrando no Label1, no final dos 10 segundos aparece no Label2 o resultado
Public Class Form1
Private contador As Integer
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
contador += 1
Label1.Text = contador
End Sub
'essa função tem que ser marcada com Asycn para poder usar o Await dentro dela
Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'desativo o botão só pra não deixar o usuário clicar de novo enquanto não terminou de executar
Button2.Enabled = False
Label2.Text = ""
Dim valor As Integer = 100
'aqui mando iniciar uma nova Task, quando se usa a opção TaskCreationOptions.LongRunning garante que ela vai executar em outra Thread
'e o await faz a mágica de esperar essa Task terminar antes de continuar executando o seu código fora dela
Await Task.Factory.StartNew(Sub()
'Tudo que estiver dentro desta Sub() vai executar em outra Thread
Threading.Thread.Sleep(10000) 'esta linha é só para simular algo que demora 10 segundo pra executar
'eu ainda posso acessar variaveis de fora dessa sub como a variavel valor
'mas tem que tomar cuidado pois não se deve acessar controles do windows forms de outra thread
valor *= 2
End Sub, TaskCreationOptions.LongRunning)
'aqui já posso acessar de novo os controles pois já terminou de executar na outra thread
'e todo o resto volta a executar na thread principal
Label2.Text = valor
'no final ativo o botão de volta
Button2.Enabled = True
End Sub
End Class
Boa tarde, Ocelot!
Obrigado por sua resposta bem completa.
Infelizmente por ter muita pouca experiência com processos, não consegui fazer funcionar.
Se puder me ajudar, te agradeço muito:
Tudo o que preciso é fazer esta função "abaixo" ser executada num processo a parte(VB.NET).
Mas, preciso que depois de executada , seja retornado o resposta da função(Return)
Public Function FuncaoqueQueroExecutar(ByVal Par1 As Integer, ByVal Par2 As Integer) As Boolean
Try
C= Par1 + Par2
Select case C
case is > 10
Return True
Case else
Return False
End select
Catch
End try
End Function
Obrigado por sua resposta bem completa.
Infelizmente por ter muita pouca experiência com processos, não consegui fazer funcionar.
Se puder me ajudar, te agradeço muito:
Tudo o que preciso é fazer esta função "abaixo" ser executada num processo a parte(VB.NET).
Mas, preciso que depois de executada , seja retornado o resposta da função(Return)
Public Function FuncaoqueQueroExecutar(ByVal Par1 As Integer, ByVal Par2 As Integer) As Boolean
Try
C= Par1 + Par2
Select case C
case is > 10
Return True
Case else
Return False
End select
Catch
End try
End Function
Você pode utilizar o componente BackgroundWorker, no DoWork você seta o e.Result, e recebe ele no RunWorkerCompleted
OCELOT,
Boa seu exemplo !.
Tenho utilizado Task também em alguns casos porque só conheci ele um pouco depois do BackgroundWorker, você tem alguma coisa contra o BackgroundWorker ?.
Valeu.
OCELOT,
Boa seu exemplo !.
Tenho utilizado Task também em alguns casos porque só conheci ele um pouco depois do BackgroundWorker, você tem alguma coisa contra o BackgroundWorker ?.
Valeu.
Nada contra o BackgroundWorker, inclusive minha resposta original, antes do site bugar e eu perder ela, eu citava ele como uma alternativa a usar Threads diretamente para o caso de se estar usando WindowsForms, só acho ele menos versátil já que você tem que usar os eventos deles, mas no final acaba tendo o mesmo resultado
Alterado em 05/06/2023 11:22:44
OCELOT, Obrigado.
MARCOS,
Para usuário mais novo que tem dificuldades, essa opção é mais simples de entender caso não consiga a opção do OCELOT que é a melhor.
Citação:Nada contra o BackgroundWorker, inclusive minha resposta original, antes do site bugar e eu perder ela, eu citava ele como uma alternativa a usar Threads diretamente para o caso de se estar usando WindowsForms, só acho ele menos versátil já que você tem que usar os eventos deles, mas no final acaba tendo o mesmo resultado
MARCOS,
Para usuário mais novo que tem dificuldades, essa opção é mais simples de entender caso não consiga a opção do OCELOT que é a melhor.
Faça seu login para responder