Ir ao conteúdo

[Ajuda VB.net] Pausando uma funcao


mazzotti

Posts recomendados

Postado

To usando essa funcao

Private Sub TypingEffect(ByRef msg As String)
Dim msgLen As Short
Dim currIndex As Short
Dim currChar As String
Dim currText As String
msgLen = Len(msg)
Do While currIndex <= msgLen
System.Windows.Forms.Application.DoEvents()
currIndex = currIndex + 1
currChar = Mid(msg, currIndex, 1)
currText = currText & currChar
Label1.Text = currText
System.Windows.Forms.Application.DoEvents()
Thread.Sleep(150)
Loop
End Sub

e

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
if Button2.text = "Pause then
Button2.text = "Continuar"
[B]Aqui ta meu problema..como eu faco pra da um pause nessa funcao?[/B]
else if Button2.text = "Continuar" then
[B]E dps continuar aqui[/B]
else
Label1.Text = Nothing
Dim reader As New StreamReader("c:\a.txt", System.Text.Encoding.Default)
Button2.text = "Pause"
end if
End Sub

  • Membro VIP
Postado

A sua ideia é pausar a função "TypingEffect" certo?

Você pode fazer isso executando ela em uma thread separada (veja a classe System.Threading.Thread), essa classe tem as funções "Suspend" e "Resume" que fazem o que você quer, elas não são muito seguras... Mas servem para esse tipo de aplicação simples.

ps: Com o Sleep pode tirar esses DoEvents ai.

Postado

Opa mano obrigado pela ajuda..tipo..se sabe algum outro jeito que eu posso usar pra tar um intervalo entre as letras q ele vai digita? o que usando Thread.Sleep() ele da "Sleep" no aplicativo todo =/

  • Membro VIP
Postado

O Sleep só deveria dar o "Sleep" na thread que ele ta rodando, por isso executar a função em outra thread ajuda...

Mas sim, tem um outro jeito que é até melhor, usando o componente "Timer".

Postado

Opa..valeu vou tenta fazer aqui dps respondo..valeu pela ajuda

olha..eu acho que eu consegui fazer em outra thread mas nao to conseguindo pausar..

eu fiz assim:

adicionei uma novo arquivo de classe no projeto e nele coloquei.

  Citação
Imports System.Threading

Public Class Threadtype

Public Sub TypingEffect2(ByRef msg As String)

Dim msgLen As Short

Dim currIndex As Short

Dim currChar As String

Dim currText As String

msgLen = Len(msg)

Do While currIndex <= msgLen

currIndex = currIndex + 1

currChar = Mid(msg, currIndex, 1)

currText = currText & currChar

Principal.Label1.Text = currText

Loop

End Sub

End Class

ai dps no evento do botao eu coloquei no form principal

  Citação
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

Dim worker As New Threadtype()

worker.TypingEffect2("Text")

End Sub

so que depois nao consigo usar

Threadtype.suspende

=/ o que to fazendo de errado?

  • Membro VIP
Postado

Você precisa usar a classe Thread, fica mais ou menos assim:


Dim worker As New Thread(AddresOf TypingEffect2)
worker.Start("Text")
worker.Suspend()
worker.Resume()

Postado
  Citação
Error 3 Overload resolution failed because no accessible 'New' can be called with these arguments:

'Public Sub New(start As System.Threading.ParameterizedThreadStart)': Method 'Public Sub TypingEffect2(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ParameterizedThreadStart(obj As Object)'.

'Public Sub New(start As System.Threading.ThreadStart)': Method 'Public Sub TypingEffect2(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ThreadStart()'

  Citação

Dim worker As New Threadtype()

Dim Thread As New Thread(AddressOf worker.TypingEffect2)

Desculpa ae mano..mas nao to conseguindo =p, ja procurei exemplo na internet mas continua dando o mesmo erro =/

ele nao aceita Public Sub TypingEffect2(ByRef msg As String) so Public Sub TypingEffect2

  • Membro VIP
Postado

Não é assim... Não precisa criar uma classe só pra isso:


Imports System.Threading
Class Form1
Private Sub TypingEffect(ByRef msg As String)
Dim msgLen As Short
Dim currIndex As Short
Dim currChar As String
Dim currText As String
msgLen = Len(msg)
Do While currIndex <= msgLen
System.Windows.Forms.Application.DoEvents()
currIndex = currIndex + 1
currChar = Mid(msg, currIndex, 1)
currText = currText & currChar
Label1.Text = currText
System.Windows.Forms.Application.DoEvents()
Thread.Sleep(150)
Loop
End Sub
Dim worker As Thread
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
if Button2.text = "Pause" then
Button2.text = "Continuar"
worker.Suspend()
elseif Button2.text = "Continuar" then
Button2.text = "Pause"
worker.Resume()
else
worker = New Thread(AddresOf TypingEffect2)
worker.Start("Text")
Label1.Text = Nothing
Button2.text = "Pause"
end if
End Sub
End Class

Postado

continua dando o mesmo erro mano :(

Error 4 Overload resolution failed because no accessible 'New' can be called with these arguments:

'Public Sub New(start As System.Threading.ParameterizedThreadStart)': Method 'Private Sub TypingEffect(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ParameterizedThreadStart(obj As Object)'.

'Public Sub New(start As System.Threading.ThreadStart)': Method 'Private Sub TypingEffect(ByRef msg As String)' does not have the same signature as delegate 'Delegate Sub ThreadStart()'.

  • Membro VIP
Postado

Ah... Altere a declaração do TypingEffects para:


Private Sub TypingEffect(msg As Object)

Ou então crie uma função só para essa conversão:


Private Sub TypingEffectThread(msg As Object)
TypingEffect(msg)
End sub

Postado

hsuaiushuahuishauih

Muito obrigado por ta me ajudando..tipo..o Pause funciono perfeitinho..so que quando eu clico para continuar..ele recomeça

Agora o sleep so ta dando "Sleep" no Thread..uma coisa ja fico certa =)

obrigado + uma vez

Postado

recebi esse erro:

  Citação
Cross-thread operation not valid: Control 'Label1' accessed from a thread other than the thread it was created on.
mesmo clikando pra continua ele fica voltando nisso e aparece na linha
  Citação
Label1.Text = currText

Eu diria q e alguma problema na minha funcao =/

e agora apareceu outro problema também: como eu faco pra ele identificar quando acaba de digita o meu texto?

  • Membro VIP
Postado

Esqueci desse detalhe...

Você pode evitar esse erro criando (mais) um metodo na classe form1 e chamando ele via Invoke:


Sub setLabel(value As Object)
Label1.Text = value
End Sub

E na hora de chamar da outra thread:


Invoke(AddressOf setLabel, currText)

Controles não podem ser acessados de threads diferentes a não ser pelo Invoke, que todos eles tem...

Postado

intao ficaria assim:

    Sub setLabel(ByVal value As Object)
Label1.Text = value
End Sub

e

    Private Sub TypingEffect(ByVal msg As Object)
Dim msgLen As Short
Dim currIndex As Short
Dim currChar As String
Dim currText As String
msgLen = Len(Msg)
Do While currIndex <= msgLen
currIndex = currIndex + 1
currChar = Mid(msg, currIndex, 1)
currText = currText & currChar
Invoke(AddressOf setLabel, currText)
Thread.Sleep(150)
Loop
End Sub

desculpa pelas perguntas idiotas..e que to meio que começando com vb.net

Postado
  EduardoS disse:
Isso,

Ah, esqueci de falar no inicio, e coloquei só no segundo post, mas porque não usa o timer?

1 problema por vez ne =p, to começando com vb

ta aparecendo esse erro =(

Error	1	'AddressOf' expression cannot be converted to 'System.Delegate' because type 'System.Delegate' is declared 'MustInherit' and cannot be created.

  • Membro VIP
Postado

Isso que da confia nas conversões automáticas do VB :muro:

Na linha do Invoke coloque:


Invoke(New ParameterizedThreadStart(AddressOf setLabel), New Object(){currText})

No lugar do ParameterizedThreadStart você poderia criar um Delegate para colocar ai, esse funciona por ter a mesma assinatura, o New Object(){currText} fica assim pelo segundo parâmetro ser uma Array, mas eu não tenho certeza se é "param array" ou não (to sem o Visual Studio aqui, fazendo tudo de cabeça e sem testar, ai ja viu né...), se for... Então vai da pau, mas ai é só passar o currText direto.

ps: Ok, você ta aprendendo, brincar com threads é legal, mas... Você ta entendendo como funciona ou só copiando o código? Se alguma coisa ficar difícil pode falar, esse código ai tem valor para aprender como usar threads com forms, mas só para fazer o que você queria usar o timer é muito mais simples.

Postado

Nao to entendendo 100% mas to entendo sim :)

Mas tipo..o continue nao ta funcionando ainda :(

sera que devo tentar fazer com timer?

acho que e melhor..porque eu tb preciso fazer alguma coisa pra ele identifica quando acaba de digita a ultima letra do text

  • Membro VIP
Postado

Isso do continue é estranho... Só debugando mesmo e vendo por onde eles passa.

O uso do timer é mais indicado nessa situação.

E para ele identificar que acabou coloque alguma coisa depois do "Loop", e isso vale tanto para o timer quanto para a thread.

Postado

Consegui fazer o treco pra ve quando acaba o texto ja =p

consegui arrumar o treco do continuar tb =/ era um erro estúpido =p

acha que eu devo mudar pra timer? ou deixa assim mesmo? se sim..como eu faria para cada vez que o timer chega no 0 ele digita uma letra?

  • Membro VIP
Postado

Usando o timer:

- Considere o evente Tick como sendo o código dentro do Do While...Loop;

- O Invoke e o Sleep são desnecessários;

- As variáveis você declara na classe;

- No evento faça uma verificação para saber quando chgou o ultimo char assim poderá tomar uma ação;

- Para iniciar/reiniciar coloque os valores inicias para as variaveis e a propriedade Enabled do timer como true;

- Para pausar coloque a propriedade Enabled do timer como false;

- Para continuar coloque a propriedade enabled como true, sem alterar as variaveis.

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!