Programm hängt sich leider immer wieder auf, bitte um Hilfe
lima-city → Forum → Programmiersprachen → Basic
abhilfe
anwendung
ausgabe
byte
code
double
funktion
genauigkeit
grenzender wahrscheinlichkeit
interner fehler
kern
minute
nennen
option
programm
schleife
sicherheit
untergrenze
warte
warten
-
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
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
Hey vielen dank für die schnelle antwort, funktioniert wunderbar thx
-
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 ... -
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 ...
[/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 =)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage