EXECUTAR PROCESSOS, PERMITE RESPOSTAS?

MARCOS 30/05/2023 09:06:49
#501452
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???
KERPLUNK 30/05/2023 14:25:37
#501453
Dim x = NomeDoProcesso.ExitCode
MARCOS 31/05/2023 08:31:49
#501456
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????
OCELOT 31/05/2023 09:51:45
#501457
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

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
MARCOS 31/05/2023 14:19:49
#501458
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
NILSONTRES 02/06/2023 17:21:54
#501469
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 05/06/2023 10:45:36
#501483
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
NILSONTRES 05/06/2023 11:21:39
#501484
Alterado em 05/06/2023 11:22:44 OCELOT, Obrigado.
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