kostenloser Webspace werbefrei: lima-city


Programm hängt sich leider immer wieder auf, bitte um Hilfe

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    ghostrider

    Kostenloser Webspace von ghostrider

    ghostrider hat kostenlosen Webspace.

    Halli, Hallo,

    Ich hatte mir zum Test ein Programm geschrieben das per Sendkeys strings an das jeweils offen Fenster senden sollte, allerings stürzt dieses Programm lediglich nach wenigen Minuten ab, leider weiss ich aber nicht wieso, deshalb wollte ich fragen ob ihr wisst wo ran es liegt.
    Ich bedanke mich schon mal im voraus, und bitte habt nachsicht bin noch VB kiddie :lol:

    mfG
    Chris

    Code_Fenster:
    Option Explicit
    Public Sub Form_Load()
    InAction = 0
    End Sub
    Public Sub btn_start_Click()
    InAction = 1
    Do While InAction = 1
    Sleep 300000                    \'Warte 5 Minuten
    Dim rndnumber As Byte           \'Zufallszahl für zufälligen Befehl
    Randomize -Timer
    rndnumber = Int(Rnd(1) * 3) + 1
    Select Case rndnumber           \'Ausgabe des Textes
    Case 1
    SendKeys \"Test1\", True
    Case 2
    SendKeys \"Test2\", True
    Case 3
    SendKeys \"Test3\", True
    Case Else
    MsgBox \"Es trat ein Interner Fehler auf, Bitte updaten Sie ihre Version, wenn möglich\", vbOKOnly + vbInformation, \"Interner Fehler\"
    End Select
    Loop
    End Sub

    Code_Module1:
    Option Explicit
    
    Global InAction As Byte
    Declare Sub Sleep Lib \"kernel32\" (ByVal dwMilliseconds As Long)



    Beitrag geändert: 16.6.2008 18:41:59 von ghostrider
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Hi,

    dein Fehler liegt an der eingebauten Sleep-Funktion aus der Windows-API. Diese Funktion friert nämlich das Programm ein für den gewünschten Zeitraum - somit nimmt das Programm keine Benutzeraktionen auf und stürzt beim Versuch darauf zuzugreifen ab.

    Bessere Methode: Eine Sleep-Funktion selber schreiben =)

    ich hab einfach mal alles in die Form1 gepackt, somit sparst du das Modul1.
    Statt dem Byte-Typ bei \"InAction\" eignet sich besser der Typ Boolean mit den Werten \"True\" und \"False\".

    Mein Vorschlag:
    Option Explicit
    
    Public InAction As Boolean
    
    Public Sub Sleep(ByVal MilliSeconds As Double)
    
        Dim TimerStart As Double
        TimerStart = Timer
        
        Do
            DoEvents
        Loop While Timer <= TimerStart + MilliSeconds
    
    End Sub
    
    Public Sub Form_Load()
    
        InAction = False
        
    End Sub
    
    Public Sub btn_start_Click()
    
        InAction = True
        Dim RndNumber As Byte               \' Variable außerhalb der Schleife deklarieren, um Ressourcen zu schonen
        
        Do While InAction = True
        
            Sleep 300000                    \' Warte 5 Minuten
            
            Randomize                       \' Randomize alleine genügt völlig!
            RndNumber = Int(3 * Rnd + 1)    \' Formel lautet: Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
            
            Select Case RndNumber           \' Ausgabe des Textes
                Case 1
                    SendKeys \"Test1\", True
                Case 2
                    SendKeys \"Test2\", True
                Case 3
                    SendKeys \"Test3\", True
                Case Else
                    MsgBox \"Es trat ein interner Fehler auf.\" & vbNewLine & \"Bitte updaten Sie Ihre Version, falls möglich.\", vbOKOnly Or vbInformation, \"Interner Fehler\"
            End Select
            
        Loop
        
    End Sub


    [Getestet und für gut befunden ;)]


    Beitrag geändert: 16.6.2008 20:12:17 von cbhp
  4. Autor dieses Themas

    ghostrider

    Kostenloser Webspace von ghostrider

    ghostrider hat kostenlosen Webspace.

    Hey vielen dank für die schnelle antwort, funktioniert wunderbar thx :thumb:
  5. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Also, ganz kann ich dir nicht zustimmen:

    Do
    DoEvents
    Loop While Timer <= TimerStart + MilliSeconds

    Hast du dir die Prozessornutzung dazu angesehen? Der Kern, auf dem das Programm läuft, wird (mit an Sicherheit grenzender Wahrscheinlichkeit) zu 100% ausgelastet sein!
    Ich habe mit da immer Abhilfe geschaffen, indem ich trotzdem in die Schleife ein \"kleines\" Sleep einbaue (etwa 10 oder 100 ms), je nachdem, welche Genauigkeit (Auflösung, wie immer du es nennen willst) die Anwendung beim Warten erfordert.

    Nur so eine Idee ... :angel:
  6. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Hast du dir die Prozessornutzung dazu angesehen? Der Kern, auf dem das Programm läuft, wird (mit an Sicherheit grenzender Wahrscheinlichkeit) zu 100% ausgelastet sein!
    Ich habe mit da immer Abhilfe geschaffen, indem ich trotzdem in die Schleife ein \"kleines\" Sleep einbaue (etwa 10 oder 100 ms), je nachdem, welche Genauigkeit (Auflösung, wie immer du es nennen willst) die Anwendung beim Warten erfordert.

    Nur so eine Idee ... :angel:
    [/quote]

    Yep ich weiß ;)

    Für solche Funktionen sollte man nämlich weder die von mehr genannte selbstgeschriebene Wartefunktion noch die Sleep-Methode nutzen, sondern einen echten Timer (das Steuerelement \"Timer\") einfügen.

    Ein Timer löst nach einer festgelegten Anzahl von Millisekunden selbst eine Funktion aus. Fertig =)
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!