Hilfe bei Random Pause

  • Hallo Zusammen

    Ich habe mich in letzter Zeit ein bischen mit Scripten befasst und mir ein Paar kleine Tools gemacht die mir das Leben mit Windows sehr erleichtern :)
    Im unteren AutoIt Basic Bereich muss ich dazu sagen.
    Nun bin ich an einem neuen "Projekt" und benötige eure Hilfe ^^

    Das Skript öffnet ein Bild (jpg), zeigt es für eine Random Zeit, und zeigt dann das nächste Bild. (eine art Diashow)
    Alles in allem eine *relativ* einfache Sache, wäre da nicht die Anforderung einer einmaligen *längeren* Random Pause bei einem Random Bild.

    So sollte es sein: Zeigt Bilder 1-30 (aufsteigend) mit *kurzer* Random Pause zwischen jedem Bild an. Dann das ganze wieder von vorne.
    Zwischen Bild 5 und 25, Random Bild, und nur bei 1 Bild pro Durchlauf soll es eine! *lange* Random Pause haben.


    Ich bin für jeden guten Rat sehr dankbar :D


    Grüsse Helga

    Einmal editiert, zuletzt von Helga (11. August 2012 um 09:56)

  • Ich kapiere nur Bahnhof...



    Ich habe das verstanden:


    Du willst zufällig Bilder öffnen und bevor das nächste Bild erscheint soll eine zufällige Pause dazwischen entstehen. Richtig???


    Edit: Jetzt habe ich es verstanden. Ich schreibe dir eben mal ein Script der dir das ganze erläutert.


    Edit 2: Hier habe ich das Script:

    [autoit]

    ;~ Statt ein Bild nehmen wir mal einen Text, um das ganze zu veranschaulichen.
    ;~ Genau genommen nehmen wir 30 Texte in einen Array.

    [/autoit][autoit][/autoit][autoit]

    Dim $Text[30] ;~ Array wird deklariert.
    For $i = 0 To UBound($Text, 1) -1 ;~ Ein Array beginnt immer mit der Indexnummer '0'.
    $Text[$i] = 'Text ' & $i +1
    Next

    [/autoit][autoit][/autoit][autoit]

    #cs

    [/autoit][autoit][/autoit][autoit]

    Nun müssen wir uns überlegen, was das Script machen soll:
    Es soll zwischen den Texten 1-4 und 26-30 eine Feste Sleep Zeit verwenden.
    Es soll zwischen den Texten 5-25 eine Zufällige Sleep Zeit verwenden.
    Jeder Text soll 1x Angezeigt werden.

    [/autoit][autoit][/autoit][autoit]

    Wir brauchen:
    1 For-Schleife
    If-abfragen
    2 Variablen
    Und die entsprechenden Befehle ^^

    [/autoit][autoit][/autoit][autoit]

    #ce

    [/autoit][autoit][/autoit][autoit]

    $Fix_Time = 250 ;~ Als Feste Zeit für die Texte 1-4 und 26-30 haben wir 0,25 Sekunde.

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($Text, 1) -1
    If $i > 3 And $i < 25 Then ;~ Es muss beachtet werden, dass die Indexnummer bei 0 beginnt.
    $Random_Time = Random(500, 2000, 1) ;~ Eine Zufällige Zeit von 0,5-2 Sekunden.
    Sleep($Random_Time)
    ConsoleWrite($Text[$i] & ' | ' & $Random_Time/1000 & ' Sekunden' & @CRLF)
    Else
    Sleep($Fix_Time)
    ConsoleWrite($Text[$i] & ' | ' & $Fix_Time/1000 & ' Sekunden' & @CRLF)
    EndIf
    Next

    [/autoit]


    Und einmal ohne Kommentare:

    Spoiler anzeigen
    [autoit]

    Dim $Text[30]
    For $i = 0 To UBound($Text, 1) -1
    $Text[$i] = 'Text ' & $i +1
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Fix_Time = 250

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($Text, 1) -1
    If $i > 3 And $i < 25 Then
    $Random_Time = Random(500, 2000, 1)
    Sleep($Random_Time)
    ConsoleWrite($Text[$i] & ' | ' & $Random_Time/1000 & ' Sekunden' & @CRLF)
    Else
    Sleep($Fix_Time)
    ConsoleWrite($Text[$i] & ' | ' & $Fix_Time/1000 & ' Sekunden' & @CRLF)
    EndIf
    Next

    [/autoit]

    6 Mal editiert, zuletzt von Yjuq (10. August 2012 um 16:31)

  • Edit: Whopppaaa da war jemand schneller...naja mal sehen :D

    Sooo...ich habs mal so geschrieben wie ich das verstanden habe, du musst aber noch ein paar Sachen darin anpassen:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $BilderPfad = "C:\....." ;Hier den Pfad zu den Bildern einfügen

    [/autoit] [autoit][/autoit] [autoit]

    ;Wir schreiben nun erstmals alle Bilder in ein Array, denn von dort kann man sie leichter abrufen
    ;Entweder so:
    $BilderArray = _FileListToArray($BilderPfad) ;Schreibt den Ordnerinhalt in ein Array (Dort dürfen sich dann aber nur die Bilder befinden, die du anzeigen willst.

    [/autoit] [autoit][/autoit] [autoit]

    ;Oder so:
    $BilderArray2 = _FileListToArray($BilderPfad, "*.jpg") ;Schreibt alle Bilder mit dem Datentyp .jpg in das Array (Klappt auch mit anderen Bildertypen, dafür müssen aber alle Bilder denselben Datentyp haben).

    [/autoit] [autoit][/autoit] [autoit]

    ;Ich werde Methode 1 verwenden, wenn du das ändern willst lösche die Variabte und ändere den Variablennamen der 2. Methode zu $BilderArray

    [/autoit] [autoit][/autoit] [autoit]

    ;Eigentlich käme jetzt eine FOR-Schlaufe, aber ich hasse die Syntax von FOR-Schlaufen in AutoIt, darum mache ich jetzt einfach eine DO-Schlaufe (verzeiht mir Kollegen ^^). Die führt den darinstehenden Code mindestens einmal aus und bricht ab sobald die Bedinung erfüllt wurde.
    $RandomSelected = Random(5, 25, 1) ;Hier wählt er das Bild aus, welches eine zufällige Zeit angezeigt werden soll
    $Zaehler = 1

    [/autoit] [autoit][/autoit] [autoit]

    Do
    If $Zaehler <> $RandomSelected Then ;Wenn das aktuelle Bild NICHT das mit zufälliger Zeit ist
    SplashImageOn($BilderArray[$Zaehler]) ;Zeigt das Bild an
    Sleep(5000) ;Hier die Dauer eintragen, für die das Bild erscheinen soll (die hier ist dann die FIXE Zeit)
    Else
    $RandomPause = Random(2000, 10000, 1) ;Hier wird die zufällige Anzeigezeit generiert, zu Testzwecken habe ich die Limite auf 2 bis 10 Sekunden gesetzt.
    SplashImageOn($BilderArray[$Zaehler]) ;Zeigt das Bild an
    Sleep($RandomPause) ;Pause zwischen den Bildern (die hier ist dann unsere ZUFÄLLIGE Pause)
    EndIf
    $Zaehler = $Zaehler + 1
    Until $Zaehler = 25
    SplashOff() ;Das Bild verschwindet wieder

    [/autoit]

    Bild1: Ich beim debuggen

  • @Make Warum so "groß" und unflexibel?

    Du deklarierst ein Array mit Global, dies sollte aber eher mit Dim gemacht werden.

    In deinem Script (unkommentiert) kann man Zeile 2 bis 31 durch 3 Zeilen Code ersetzen:

    [autoit]


    For $iIndex = 0 To 29
    $Text[$iIndex] = "Text " & $iIndex + 1
    Next

    [/autoit]

    Und die For-Schleife (Zeile 37) ist unflexibel. Wird das Array verändert, klappt die For-Schleife nicht mehr.

    [autoit]


    For $i = 0 To UBound($Text) - 1

    [/autoit]


    Passt sich der Array-Größe an. ;)

    Sonst aber schön geschrieben, und nimm meine Kritik nicht zu ernst.:P

    lg chess

  • Mit dem Global >>> hab ich mir angewöhnt x.x

    Zu der Mega langen Liste:
    Ich wollt einfach zeigen, dass die Indexnummer bei 0 beginnt. So können anfänger, die das Thread hier lesen alles nachvollziehen.

    Mit dem UBound |> Kahm mir gerade nicht in den Sinn ^^


    Ich versuche möglichst viel in meine 'Hilfestellung' zu erklären . So kommen auch die anfänger leichter mit, und lernen dazu. So zmd. die Theorie xDDD

  • Klar, hab ich mir schon gedacht.
    Allerdings, wenn ein Anfänger das Prinzip einer For-Schleife begriffen hat, wird er auch erkennen, dass Arrays bei 0 beginnen. ;)
    Dann lieber gleich so schreiben, wie man es richtig macht, und ein bisschen mehr erklären, anstatt zulassen, dass "Neue" sich was falsches angewöhnen.

    lg chess

  • +Hallo Zusammen
    Vielen Dank für eure schnellen und guten Antworten! :thumbup:

    Spoiler anzeigen
    [autoit]

    #include

    [/autoit] [autoit][/autoit] [autoit]

    $BilderPfad = "C:\....." ;Hier den Pfad zu den Bildern einfügen

    [/autoit] [autoit][/autoit] [autoit]

    ;Wir schreiben nun erstmals alle Bilder in ein Array, denn von dort kann man sie leichter abrufen
    ;Entweder so:
    $BilderArray = _FileListToArray($BilderPfad) ;Schreibt den Ordnerinhalt in ein Array (Dort dürfen sich dann aber nur die Bilder befinden, die du anzeigen willst.

    [/autoit] [autoit][/autoit] [autoit]

    ;Oder so:
    $BilderArray2 = _FileListToArray($BilderPfad, "*.jpg") ;Schreibt alle Bilder mit dem Datentyp .jpg in das Array (Klappt auch mit anderen Bildertypen, dafür müssen aber alle Bilder denselben Datentyp haben).

    [/autoit] [autoit][/autoit] [autoit]

    ;Ich werde Methode 1 verwenden, wenn du das ändern willst lösche die Variabte und ändere den Variablennamen der 2. Methode zu $BilderArray

    [/autoit] [autoit][/autoit] [autoit]

    ;Eigentlich käme jetzt eine FOR-Schlaufe, aber ich hasse die Syntax von FOR-Schlaufen in AutoIt, darum mache ich jetzt einfach eine DO-Schlaufe (verzeiht mir Kollegen ^^). Die führt den darinstehenden Code mindestens einmal aus und bricht ab sobald die Bedinung erfüllt wurde.
    $RandomSelected = Random(5, 25, 1) ;Hier wählt er das Bild aus, welches eine zufällige Zeit angezeigt werden soll
    $Zaehler = 1

    [/autoit] [autoit][/autoit] [autoit]

    Do
    If $Zaehler <> $RandomSelected Then ;Wenn das aktuelle Bild NICHT das mit zufälliger Zeit ist
    SplashImageOn($BilderArray[$Zaehler]) ;Zeigt das Bild an
    Sleep(5000) ;Hier die Dauer eintragen, für die das Bild erscheinen soll (die hier ist dann die FIXE Zeit)
    Else
    $RandomPause = Random(2000, 10000, 1) ;Hier wird die zufällige Anzeigezeit generiert, zu Testzwecken habe ich die Limite auf 2 bis 10 Sekunden gesetzt.
    SplashImageOn($BilderArray[$Zaehler]) ;Zeigt das Bild an
    Sleep($RandomPause) ;Pause zwischen den Bildern (die hier ist dann unsere ZUFÄLLIGE Pause)
    EndIf
    $Zaehler = $Zaehler + 1
    Until $Zaehler = 25
    SplashOff() ;Das Bild verschwindet wieder

    [/autoit]

    Ich hab da einen Fehler in Line 38, If $Zaehler <> $RandomSelected Then
    If $Zaehler <> ^ ERROR
    Error: Variable used without being declared.

    Versteh ich nicht du hast ja $RandomSelected deklariert...

    Macht er in deinem Script zwischen Bild 5 und 25 bei jedem Bild eine *kurze* zufällige Pause=?

    Wäre super wenn er zwischen Bild 1 und 30 eine *kurze* zufällige Pause machen würde. Sagen wir: Sleep(Random(4000, 6000, 1))
    Irgendwo zwischen Bild 5 und 25 (Random!! nicht jedesmal das gleiche Bild pro Durchlauf und nur bei einem Bild pro Durchlauf) eine *längere* zufällige Pause. Sagen wir Sleep(Random(9000, 12000, 1))

    Mit Durchlauf mein ich Bilder 1-30 zeigen (1 Durchlauf) und dan wieder 1-30 (2 Durchlauf) usw. Endlosschleife eben.

    Mein Problem ist das ich die *längere* zufällige Pause nicht zu 1 Bild (nur 1) zwischen 5 und 25 (Random!) bringe.

    Gerade gesehen das ich im falschen Tread aufgemacht habe. Wollte mich nicht hier anmelden und gleich am ersten Tag ins Programmieranfragen schreiben: Ich habe kp von autoit macht mal. Hatte Programmierfragen gelesen und wollt eigtl. nur bei meiner Scriptvorlage die *längere*rndZeit auf rndBild geklärt haben. Aber ich muss zugeben Generals Script ist kürzer und besser als meins :)

    Einmal editiert, zuletzt von Helga (11. August 2012 um 09:58)

  • Also ich habe gerade gesehen, das der include alleine steht (falsch kopiert? das sollte eg. "#include <File.au3>" sein). Ich hab den Code leider selbst nicht getestet und hab um die Zeit auch keinen Bock mehr...ich sehs mir morgen mal an.

    Bild1: Ich beim debuggen