Zeitabstand in VB.NET

03/01/2014 23:16 |★|UnReaL#1
Hey Leute, ich fange im Moment an mit dem Programmieren, als Einstieg will ich einen kleinen "Bot" schreiben für das Spiel Flapmmo.com.
Mein aktueller code sieht erst so aus:

PHP Code:
Public Class Form1
    
Private Sub Button1_Click(sender As ObjectAs EventArgsHandles Button1.Click
        Dim Id
() As Process Process.GetProcessesByName("firefox")
        
AppActivate(Id(0).Id)
        
SendKeys.Send("ENTER")
    
End Sub
End 
Class 
sprich, er setzt einfach Firefox in den Vordergrund und drückt einmal Enter, springt also einmal, nun will ich aber, dass er weiterhin Enter drückt in von mir geregelten Zeitabständen, ich hab das ganze schon mit sehr vielen Timern versucht, allerdings ist das sehr aufwändig und die Zeit ist irgendwie immer anderst also einfach zu ungenau.

Wie kann ich das besser machen?
03/01/2014 23:36 tolio#2
[Only registered and activated users can see links. Click Here To Register...]
03/01/2014 23:45 |★|UnReaL#3
Danke, aber dabei hab ich irgendwie das Problem, dass das nur einmal geht, sprich er führt Sendkeys aus, pausiert, und macht dann nichtsmehr.

PHP Code:
Public Class Form1
    
Private Sub Button1_Click(sender As ObjectAs EventArgsHandles Button1.Click
        Dim Id
() As Process Process.GetProcessesByName("firefox")
        
AppActivate(Id(0).Id)
        
SendKeys.Send("ENTER")
        
Threading.Thread.Sleep(1000)
        
SendKeys.Send("ENTER")
        
Threading.Thread.Sleep(1000)
        
SendKeys.Send("ENTER")
    
End Sub
End 
Class 
03/02/2014 00:03 qkuh#4
Stichwort: Schleife
03/02/2014 11:13 |★|UnReaL#5
Tut mir leid ich komme mit diesen vielen Schleifen nicht klar. Könnte mir mal einer ein Beispiel machen ? :) Die Zeitabstände sollen übrigens verschieden sein können.
03/02/2014 14:00 Syc#6
[Only registered and activated users can see links. Click Here To Register...]
03/02/2014 21:40 |★|UnReaL#7
Ich verstehe das jetzt einigermaßen, aber kapiere immernoch nicht wie ich das machen soll, dass er immer für eine andere Zeit pausiert, könnte mir das jemand in einem Beispielcode erklären ? :)
03/02/2014 22:20 Rorc#8
PHP Code:
Public Class Form1

    
Private Sub SendToGame(ByVal s As StringByVal d As Integer)
        
Dim Id() As Process Process.GetProcessesByName("firefox")
        
AppActivate(Id(0).Id)
        
SendKeys.Send(s)
        
Threading.Thread.Sleep(d)
    
End Sub


    
Private Sub Button1_Click(sender As ObjectAs EventArgsHandles Button1.Click
        SendToGame
("Enter"1250)
    
End Sub

End 
Class 
Etwas so grob in dem Stil dürfte für dich von Nutzen sein, somit wird dein Code auch nicht unnötig lange, wenn du viele verschiedene Sachen in unterschiedlichen Abständen machen willst.
03/03/2014 10:13 |★|UnReaL#9
Danke aber durch diesen Sleep befehl stopt einfach der Browser komplett in der Zeit.
03/03/2014 11:59 qkuh#10
Stichwort: Multithreading
03/06/2014 11:09 maxasoft#11
Quote:
Originally Posted by qkuh View Post
Stichwort: Multithreading
Richtig.

Starte deine Sub einfach in einem neuen Thread:

Code:
With New Thread(Sub() deinesub())
            .IsBackground = True
            .Start()
        End With
In deinem Falle also so:

Code:
Public Class Form1

    Private Sub SendToGame(ByVal s As String, ByVal d As Integer, ByVal anzahl as Integer)
For i as Integer = 1 to anzahl
Dim Id() As Process = Process.GetProcessesByName("firefox")
        AppActivate(Id(0).Id)
        SendKeys.Send(s)
        Threading.Thread.Sleep(d)
Next
        
    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
With New Thread(Sub() SendToGame("Enter", 1250, 10))
            .IsBackground = True
            .Start()
        End With
        
    End Sub

End Class
03/09/2014 12:39 xcyancali#12
Hallo UnReal,

ich habe auch schon einige Probleme damit gehabt.
Entweder du Definierst einen neuen Thread und löst das ganze über Threading.Thread.sleep() oder du machst es so:

Code:
    Sub sleep(ByVal sleeptime As Integer)
        Dim stoppw As New Stopwatch

        stoppw.Start()

        Do Until stoppw.ElapsedMilliseconds >= sleeptime
            Application.DoEvents()

        Loop
        stoppw.Stop()
        stoppw.Reset()


    End Sub
Lg,
xCyancali
03/09/2014 12:47 'Heaven.#13
^ So macht man es nicht...

Nutz niemals Application.DoEvents()
03/09/2014 13:16 tolio#14
^ zu generell, wenn man weiß was man tut gibts auch legit bereiche wo mans verwenden kann. weiteres wie immer im msdn: [Only registered and activated users can see links. Click Here To Register...]

btt: threading ist hier angegebracht und sollte auch genutzt werden
03/09/2014 17:04 'Heaven.#15
Await:Async wäre trotzdem eine bessere alternative