Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Claudio Neto

Executar duas tarefas simultâneas

Recommended Posts

Olá a todos.

 

Tenho duas perguntas a fazer.

 

Primeiro, como faço para executar duas tarefas ao mesmo tempo. Por exemplo, enquanto executo uma consulta num banco, coloco uma animação como no windows que fica passando um papelzinho de uma pasta para outra.

 

E segundo, como faço um botão de "parar". Vamos supor que no meio dessa mesma consulta eu queira cancelá-la. Normalmente não tenho como fazer isso, terei que esperar a consulta acabar, mas não quero isso, quero interrompê-la no meio mesmo.

 

 

Alguém sabe me auxiliar nessas tarefas?

 

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, como faço para executar duas tarefas ao mesmo tempo. Por exemplo, enquanto executo uma consulta num banco, coloco uma animação como no windows que fica passando um papelzinho de uma pasta para outra.

Isso dae é facil, antes de você fazer a ação, você chama um gif animado.... é.. no VB não tem isso... dos poucos q achei na net a maioria era pago.. e o q era free ficava muito lerdo o gif... lerdo mesmo... quadro a quadro

 

E segundo, como faço um botão de "parar". Vamos supor que no meio dessa mesma consulta eu queira cancelá-la. Normalmente não tenho como fazer isso, terei que esperar a consulta acabar, mas não quero isso, quero interrompê-la no meio mesmo.

não tem nada no objeto do BD (dao/ado ou sei lá) parecido com Cancel ? Se tiver deve ser só usar... também nunca precisei fazer isso.... se o sistema trava poe um DoEvents pra ve se resolve.

 

 

acho que isso dai deve te da uma iluminada.. rsrs

se não der poe denovo ae que a galera ajuda! =D

 

flw vlw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia.

 

Se quiser algo mais legal, em vb6 é possível fazer multithreads, mesmo que com algumas limtações, podemos simular isso de uma meneira até que confortável.

 

Aconselho que leia este artigo do imasters:

 

http://imasters.com.br/artigo/6275

 

Ele é muito bom, e muito bem explicado passo a passo. Por exemplo, se quiser executar uma consulta no banco e lançar uma MsgBox na tela ao mesmo tempo esse é o meio.

 

Quanto ao Cancel, esta propriedade em vb6 não existe pois o mesmo foi feito para trabalhar em STA (Single Threaded Apartment). Já no VB.NET já não sei, apesar de achar que há uma grande possibilidade de existir. Isso vai depender tanto da arquitetura da linguagem quanto da arquitetura do componente de acesso ao banco.

 

Saudações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia.

 

Se quiser algo mais legal, em vb6 é possível fazer multithreads, mesmo que com algumas limtações, podemos simular isso de uma meneira até que confortável.

 

Aconselho que leia este artigo do imasters:

 

http://imasters.com.br/artigo/6275

 

Ele é muito bom, e muito bem explicado passo a passo. Por exemplo, se quiser executar uma consulta no banco e lançar uma MsgBox na tela ao mesmo tempo esse é o meio.

 

Quanto ao Cancel, esta propriedade em vb6 não existe pois o mesmo foi feito para trabalhar em STA (Single Threaded Apartment). Já no VB.NET já não sei, apesar de achar que há uma grande possibilidade de existir. Isso vai depender tanto da arquitetura da linguagem quanto da arquitetura do componente de acesso ao banco.

 

Saudações.

 

Obrigado, irei ler o link.

 

Já ouvi falar sobre threads, mas nunca consegui encontrar algo que ensine a fazer e funcione.

 

E assim, a conexão com banco foi somente um exemplo, mas gostaria na verdade de algo meio geral, por exemplo, para ler um arquivo em excel, ou em bloco de notas, ou até mesmo para executar várias tarefas uma seguida da outra, e querer interromper no meio (por exemplo quando instalamos um programa e tem o botão cancelar).

 

Bom, já que tocou no assunto, pelo que eu andei lendo, o .net permite sim o uso de threads. Mas não estou com a menos vontade de migrar, estou aprendendo C/C++ e quase não tenho tempo para estudar, rs... Deixa mais pra frente.

 

Mas vou tentar fazer o que o link ensina, depois posto aqui se deu certo.

 

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal, funcionou sim, pelo menos o teste que ele passou.

 

Isso já diz como fazer um botão para parar uma ação, hehehe...

 

Vou adaptar para minhas necessidades, depois posto aqui para dizer como ficou e talvez ajudar a quem precise.

 

Abraços, brigadão...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia.

 

Se quiser algo mais legal, em vb6 é possível fazer multithreads, mesmo que com algumas limtações, podemos simular isso de uma meneira até que confortável.

 

Aconselho que leia este artigo do imasters:

 

http://imasters.com.br/artigo/6275

 

Ele é muito bom, e muito bem explicado passo a passo. Por exemplo, se quiser executar uma consulta no banco e lançar uma MsgBox na tela ao mesmo tempo esse é o meio.

 

Quanto ao Cancel, esta propriedade em vb6 não existe pois o mesmo foi feito para trabalhar em STA (Single Threaded Apartment). Já no VB.NET já não sei, apesar de achar que há uma grande possibilidade de existir. Isso vai depender tanto da arquitetura da linguagem quanto da arquitetura do componente de acesso ao banco.

 

Saudações.

 

Olha só, será que consegue me ajudar.

 

Estou tentando executar o passo a passo que o artigo passa, mas estou usando uma sub que precisa receber parâmetros

envianumeros(fone, cliente, status).

 

Se eu tentar usar da maneira que o tutorial passa, ficaria assim na hora de chamar a função:

 

hThread1 = CreateThread(ByVal 0&, ByVal 0&, AddressOf EnviaNumeroItBells(int(arrDados(0)),arrDados(1), arrDados(2)), ByVal 0&, ByVal 0&, hThread1_ID)

 

Só que o VB não deixa ficar assim, ele diz que há um erro de sintaxe logo após a vírgula depois de "arrDados(2))".

 

Você sabe se há alguma maneira de evitar isso, ou alguma outra forma de passar esses dados de outra maneira para a sub?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Cláudio.

 

Bem, estava testando aqui e isso o que você quer realmente é meio complicado...como tinha dito e o artigo também mostra isso, o uso de MultiThreads em VB6 é Limitadíssimo, por isso, passar uma referência (mesmo que seja por valor) para uma função multi-tarefa fica complicado, a syntax do VB ainda não permiti isso.

 

Tem como dar os pulos, realmente, eu que gosto muito de coisas estruturadas, seria obrigado a declarar algumas variáveis globais somente para passar o valor para suas funções ou sub-procedimentos. Ainda não consegui achar nada conveniente para te ajudar, mas vou ficar testando aqui...mas se precisar disso para ontem o meu conselho é tentar trabalhar com algumas variáveis globais (mesmo que estruturalmente isso seja um erro tremendo).

 

Tentei Chamar uma função dentro da Tarefa1 mas também não deu certo, o VB se perde todo quanto as referências, o erro é cabuloso.

 

Desculpe não poder ajudar por hora, mas estarei pesquisando com certeza, e se obtiver sucesso posto a resposta cabível.

 

PS: Outra coisa que me veio em mente é crirar DLL multi-tarefas, assim você só precisa citar as propriedades dele e executar a tarefa, mas também não sei se é possível, é só uma indagação.

 

Saudações.

 

edit:

--------

 

Olha, não sei se vai te ajudar, mas consegui chamar uma sub rotina dentro da tarefa com parâmetros de uma olhada

 

Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'Variáveis para servir de identificador (handle) para o Thread
Public hThread1 As Long, hThread1_ID As Long
Public hThread2 As Long, hThread2_ID As Long

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (destination As Any, ByVal source As Any, ByVal legth As Long)

Public varPointer As Long

'Suas rotinas de multitarefa
Public Sub Tarefa1()

Call s_botao(1, 2, 3)

End Sub

Public Sub Tarefa2()

Dim i As Long

Do While True
	Form1.botao2.Caption = i
	i = i + 1
	If i > 32000000 Then i = 0
Loop

End Sub

Public Sub s_botao(A As Integer, B As Integer, C As Integer)
Dim i As Long

Do While True
	Form1.botao1.Caption = i
	i = i + 1
	If i > 32000000 Then i = 0
Loop

End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehehe...

 

Foi o que eu fiz, utilizei variáveis globais. Cheguei a pensar nisso que você fez, mas não tem como, porque de qualquer forma, preciso passar os dados para a Tarefa1, que no meu casso, estou recebendo via socket. Olha que coisa ninja que estou tentando fazer, rs...

 

Mas o problema é que, mesmo utilizando da feíssima coisa de usar das variáveis globais, ainda está dando erro. Mas ai já acredito que seja em função do tamanho da minha sub, e como acabou de dizer, o uso é muito limitado. Vou postar meu código para olhar e quem sabe me dizer "você é louco, isso não vai dar nem ferrando", rs...

 

Segue abaixo:

 

CODE

no form:

 

PBagenda = Int(arrDados(0))

PBusuario = arrDados(1)

PBrecFone = arrDados(2)

hThread1 = CreateThread(ByVal 0&, ByVal 0&, AddressOf EnviaNumeroItBells, ByVal 0&, ByVal 0&, hThread1_ID)

 

no module:

Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

 

Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

 

Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

 

'Variáveis para servir de identificador (handle) para o Thread

 

Public hThread1 As Long, hThread1_ID As Long

 

Public PBagenda As Byte

Public PBusuario As String

Public PBrecFone As String

 

Public Sub EnviaNumeroItBells()

On Error GoTo TrataErro

Dim Fone As String

Dim Segmento As String

Dim Cliente As String

Dim i As Integer

 

cn.CursorLocation = adUseClient

 

If PBagenda = 0 Then

i = 0

Do While LCase(usuario) <> LCase(frmServidor.lblCliente(i).Caption)

i = i + 1

If i > 14 Then Exit Sub

Loop

auxRSCount = rs.AbsolutePosition

If rs("segmento") <> frmServidor.lblCampanha(i).Caption And frmServidor.lblCampanha(i).Caption <> "" Then

rs.Filter = "segmento = '" & frmServidor.lblCampanha(i).Caption & "' and status <> 1 and status <> 3"

If recFone <> "" Then

rs.Find "fone = '" & PBrecFone & "'", start:=1

rs.MoveNext

End If

End If

auxCampanha = frmServidor.lblCampanha(i).Caption

Fone = "" & rs.Fields("fone")

Segmento = "" & rs("segmento")

Cliente = "" & rs("cliente")

rs.Filter = "segmento <> '' and status <> 1 and status <> 3"

rs.Move auxRSCount

Else

rsAux.Open "select cod_usu from usuario where nome = '" & PBusuario & "'", cn

rsAGE.Filter = "cod_usu = " & rsAux("cod_usu")

rsAux.Close

If recFone <> "" Then

rsAGE.Find "fone = '" & PBrecFone & "'", start:=1

rsAGE.MoveNext

If rsAGE.EOF Then rsAGE.MoveFirst

End If

If IsNull(rsAGE.Fields("cod_cli")) Then

Cliente = "" & rsAGE("cliente")

Else

rsAux.Open "select nome_fantasia from cliente where cod_cli = " & rsAGE("cod_cli")

Cliente = "" & rsAux("nome_fantasia")

End If

Fone = "" & rsAGE.Fields("fone")

Segmento = "" & rsAGE("segmento")

 

rsAux.Close

End If

 

frmServidor.sckServidor(frmServidor.lstMensagem.Tag).SendData "numero:" & Fone & "," & Segmento & "," & Cliente

 

If agenda = 0 Then

rs.MoveNext

If rs.EOF Then

rs.MoveFirst

If rs.EOF Then

rs.Close

Set rs = Nothing

Set rs = New ADODB.Recordset

rs.Open "select mailing.* from mailing_" & Format(Date, "yyyy_m_d") & " as mailing where mailing.cod_usu is null and mailing.status <> 1 and mailing.status <> 3 order by cod", cn, adOpenStatic, adLockOptimistic

rs.Filter = "segmento = '" & frmServidor.lblCampanha(i).Caption & "' and status <> 1 and status <> 3"

'lstMensagem.AddItem "Mailing chegou ao fim"

frmServidor.txtMensagem.Text = Now & " - Mailing chegou ao fim" & Chr(13) & Chr(10) & frmServidor.txtMensagem.Text

End If

End If

Else

rsAGE.MoveNext

If rsAGE.EOF Then

rsAGE.MoveFirst

If rsAGE.EOF Then

rsAGE.Close

Set rsAGE = Nothing

Set rsAGE = New ADODB.Recordset

rsAGE.Open "select cliente.nome_fantasia AS CLIENTE, mailing.FONE as FONE, usuario.nome, mailing.TENTATIVAS, mailing.STATUS, mailing.SEGMENTO FROM mailing_" & Year(Date) & "_" & Format(Date, "yyyy_m_d") & " as mailing INNER JOIN CLIENTE ON mailing.COD_CLI = CLIENTE.COD_CLI inner join usuario on mailing.cod_usu = usuario.cod_usu WHERE mailing.COD_USU IS NOT NULL and mailing.status <> 1", cn, adOpenStatic, adLockOptimistic

'lstMensagem.AddItem "Mailing (AG) chegou ao fim"

frmServidor.txtMensagem.Text = Now & " - Mailing (AG) chegou ao fim" & Chr(13) & Chr(10) & frmServidor.txtMensagem.Text

End If

End If

End If

 

cn.CursorLocation = adUseServer

 

TerminateThread hThread1, 0

CloseHandle hThread1

 

Exit Sub

TrataErro:

If Err.Number <> 0 And Err.Number <> 3021 Then

registraLogErros Err.Number, Err.Description, "EnviaNumeroItBells"

Err.Clear

Resume Next

ElseIf Err.Number = 3021 Then

Resume Next

End If

 

End Sub

 

 

 

Valeu...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.