Kompliziert - "Multi Threading"

  • Frage: Viele werden mich schon wieder vergessen haben, ich war schon lange nicht mehr hier...
    Und wie ihr wisst bringe ich immer mehr oder weniger schwere Probleme mit, wenn ich hier auftauche :D

    Diesmal geht es um die "gleichzeitige" Ausführung von Befehlen im FF.
    So soll in einem Tab1 eine URL geöffnet werden und wärend auf das Fertigladen gewartet wird soll in einen anderen Tab z.B. ein Formular ausgefüllt werden, aber erst um 12:00 abgeschickt werden(als Beispiel). Natürlich ist Tab1 währenddessen die Seite fertig geladen, nun kann dort eine neue Aktion ausgeführt werden...
    Ich hoffe das Prinzip ist klar.
    Die auszuführenden Funktionen werden in ein Zweispaltiges/-dimensionales Array geschrieben(siehe zweiter Spoiler), in die zweite Spalte kommt das Ausführungsdatum, wenn die nächste Aktion sofort ausgeführt werden soll, wird statt einer Zeit einfach nur ein | eingefügt, bei einer bestimmten Zeit kommt einfach das Datum noch davor(So: 2009/01/15 23:15:00|) .
    Wenn die auszuführende Funktion auf das Fertigladen warten soll, dann wird aber nicht _FFLoadWait aufgerufen, weil das das Programm blockieren würde.
    Stattdessen wird _FFSetGet($Socket, "document.getElementById('statusbar-icon').value") aufgerufen und wenn das nicht über/gleich einem Wert(100%) ist, dann soll zum nächsten Tab gesprungen werden. Wenn eine Funktion ausgeführt wurde, dann soll die Funktion aus dem Array entfernt werden und wieder geprüft werden, ob die nächste Funktion gleich wieder ausgeführt werden kann (dies ist der Fall, wenn in der zweiten Spalte die aktuelle Uhrzeit oder ein "|" steht).
    Wenn das Element des Arrays leer ist (keine Funktionen mehr enthält), dann soll es sofort gelöscht werden (und der Tab geschlossen werden).
    Die Schleife muss dann natürlich wieder ab dem gelöschten Index weiterlaufen.
    Klingt komisch, ist aber eigentlich ganz einfach :P
    Ich bin halt total festgefahren und komm einfach nicht raus...
    Hier mal das Prinzip:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Date.au3>
    ;Array generieren
    Dim $aBefehle[Random(1, 10, 1) + 1][2]
    For $i = 1 To UBound($aBefehle) - 1
    $x = Random(1, 10, 1)
    $y = 1
    For $i2 = 1 To $x
    If Random(0, 1, 1) = 1 Then
    $aBefehle[$i][0] &= "lw, " & $i & ", " & $i2 & "|" ;bei lw eine Runde warten
    Else
    $aBefehle[$i][0] &= $i & ", " & $i2 & "|"
    EndIf
    If Random(0, 1, 1) = 1 Then
    $y = Random($y, 120, 1)
    $aBefehle[$i][1] &= _DateAdd("s", $y, _NowCalc()) & "|" ;bestimmter Zeitpunkt
    Else
    $aBefehle[$i][1] &= "|" ;immer durchführbar
    EndIf
    Next
    Next
    $ilp = 1
    _ArrayDisplay($aBefehle, UBound($aBefehle), -1, 0, ".", "|")
    ;Array anzeigen
    While 1 ;läuft die ganze Zeit, bis keine Befehle mehr im Array
    If UBound($aBefehle) = 1 Then ExitLoop
    While 1
    For $i = $ilp To UBound($aBefehle) - 1
    While ((StringLeft($aBefehle[$i][1], 1) = "|") Or (_DateDiff("s", StringLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|") - 1), _DateAdd("s", 1, _NowCalc())) = 0)) ;Raus, wenn Bedingung nicht erf?llt(Ladezustand)
    If StringLeft($aBefehle[$i][0], 2) = "lw" Then ;"wenn nicht fertig geladen"
    ; im moment einfach nur einmal überspringen
    $aBefehle[$i][0] = StringTrimLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|")) ;später nur, wenn fertig geladen
    $aBefehle[$i][1] = StringTrimLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|")) ;später nur, wenn fertig geladen
    ;ContinueLoop
    ;Else
    ContinueLoop (2)
    EndIf
    ;hier wird der Befehl später ausgeführt
    $aBefehle[$i][0] = StringTrimLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|")) ;Befehl wird nach Ausführung gelöscht
    $aBefehle[$i][1] = StringTrimLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|")) ;Befehl wird nach Ausführung gelöscht
    If $aBefehle[$i][0] = "" Then ; Wenn Element leer, dann löschen + in erste Schleife zur?ck; $ilp neu setzen; wieder For-Schleife
    _ArrayDelete($aBefehle, $i)
    $i2 = $i
    ContinueLoop (3)
    EndIf
    WEnd
    Next
    ExitLoop (1) ;Wenn For-Schleife einmal durchlaufen, dann raus
    WEnd
    WEnd
    _ArrayDisplay($aBefehle, UBound($aBefehle), -1, 0, ".", "|")

    [/autoit]


    Und das haut nich hin :/

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Date.au3>
    #include "FF.au3"
    Opt("TrayIconDebug",1)
    $Socket = _FFConnect()
    _FFTabAdd($Socket)
    _FFTabAdd($Socket)
    Dim $aBefehle[3][2] = [["", ""],[_WriteFFOpenURL("http://www.chip.de") & _WriteFFLoadWait(), _DateAdd("s", 5, _NowCalc()) & "||"],[_WriteFFOpenURL("http://www.google.de") & _WriteFFLoadWait() & _WriteFFOpenURL("http://www.computerbild.de") & _WriteFFLoadWait(), "||||"]]
    While UBound($aBefehle) > 1
    _DS_FFExecuteCommands($Socket, $aBefehle)
    Sleep(100)
    WEnd
    Func _DS_FFExecuteCommands(ByRef $Socket, ByRef $aBefehle)
    ;MsgBox(0,"","",1)
    Local $i, $aRegex
    Local $i2 = 1
    Local $RegExPattern = '(_FFAction)\(\$sAction = "(.*?)", \$sOption = "(.*?)", \$iDelay = ([+-]?\d*?)\)|(_FFClick)\(\$sObject = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFClickImage)\(\$vSearch = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFClickImageBySize)\(\$iHeight = ([+-]?\d*?), \$iWidth = ([+-]?\d*?), \$sMode = "(.*?)", \$sTarget = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFClickLink)\(\$vSearch = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFFrameLeave)\(\)|(_FFFrameEnter)\(\$vFrame = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFFormCheckBox)\(\$sName = "(.*?)", \$bChecked = (True|False), \$iIndex = ([+-]?\d*?), \$sBMode = "(.*?)", \$vForm = "(.*?)", \$sMode = "(.*?)" , \$iTabIndex = ([+-]?\d*?)\)|(_FFFormRadioButton)\(\$vRadioButton = "(.*?)", \$iIndex = ([+-]?\d*?), \$sBMode = "(.*?)", \$vForm = "(.*?)", \$sMode = "(.*?)" , \$iTabIndex = ([+-]?\d*?)\)|(_FFFormReset)\(\$vForm = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFFormSubmit)\(\$vForm = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFGetValueById)\(\$sID = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFGetValueByName)\(\$sName = "(.*?)", \$iIndex = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFKeyPress)\(\$iKeyCode = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFLoadWait)\(\$iDelay = ([+-]?\d*?), \$iTimeOut = ([+-]?\d*?), \$iPercent = ([+-]?\d*?)\)|(_FFOpenURL)\(\$sURL = "(.*?)", \$iTabIndex = ([+-]?\d*?), \$bWait = (True|False)\)|(_FFSetGet)\(\$sArg = "(.*?)", \$iTimeOut = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFSetValueById)\(\$sID = "(.*?)", \$sValue = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFSetValueByName)\(\$sName = "(.*?)", \$sValue = "(.*?)", \$iIndex = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFTabAdd)\(\$sURL = "(.*?)", \$bSelect = (True|False)\)|(_FFTabClose)\(\$vTab = ([+-]?\d*?), \$sMode = "(.*?)"\)|(_FFTabCloseAll)\(\)|(_FFTabSelect)\(\$sMode = "(.*?)", \$vTab = ([+-]?\d*?)\)'
    ;While 1
    For $i = $i2 To UBound($aBefehle) - 1
    While StringLeft($aBefehle[$i][1], 1) = "|" Or _DateDiff("s", _NowCalc(), StringLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|") - 1)) = 0
    ;MsgBox(0,"",'While StringLeft($aBefehle[$i][1], 1) = "|" Or _DateDiff("s", _NowCalc(), StringLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|") - 1)) = 0',1)
    _FFTabSelect($Socket, "index", $i)
    Sleep(50)
    $aRegex = StringRegExp(StringLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|") - 1), $RegExPattern, 3)
    For $iRegex = 0 To UBound($aRegex) - 1
    If $aRegex[$iRegex] <> "" Then ExitLoop
    Next
    Switch $aRegex[$iRegex]
    Case "_FFAction"
    _FFAction($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFClick"
    _FFClick($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
    Case "_FFClickImage"
    _FFClickImage($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFClickImageBySize"
    _FFClickImageBySize($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4], $aRegex[$iRegex + 5])
    Case "_FFClickLink"
    _FFClickLink($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFFrameLeave"
    _FFFrameLeave($Socket)
    Case "_FFFrameEnter"
    _FFFrameEnter($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFFormCheckBox"
    _FFFormCheckBox($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4], $aRegex[$iRegex + 5], $aRegex[$iRegex + 6], $aRegex[$iRegex + 7])
    Case "_FFFormRadioButton"
    _FFFormRadioButton($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4], $aRegex[$iRegex + 5], $aRegex[$iRegex + 6])
    Case "_FFFormReset"
    _FFFormReset($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFFormSubmit"
    _FFFormSubmit($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFGetValueById"
    _FFGetValueById($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
    Case "_FFGetValueByName"
    _FFGetValueByName($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFKeyPress"
    _FFKeyPress($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
    Case "_FFLoadWait"
    ;~ _FFLoadWait($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    If _FFSetGet($Socket, "document.getElementById('statusbar-icon').value") < $aRegex[$iRegex + 3] Then
    ContinueLoop (2)
    EndIf
    Case "_FFOpenURL"
    _FFOpenURL($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], False)
    Case "_FFSetGet"
    _FFSetGet($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFSetValueById"
    _FFSetValueById($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
    Case "_FFSetValueByName"
    _FFSetValueByName($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4])
    Case "_FFTabAdd"
    _FFTabAdd($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
    Case "_FFTabClose"
    _FFTabClose($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
    Case "_FFTabCloseAll"
    _FFTabCloseAll($Socket)
    Case "_FFTabSelect"
    _FFTabSelect($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
    EndSwitch
    $aBefehle[$i][0] = StringTrimLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|"))
    $aBefehle[$i][1] = StringTrimLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|"))
    ;_ArrayDisplay($aBefehle,"",-1,0,"",",")
    If $aBefehle[$i][0] = "" Then
    _ArrayDelete($aBefehle, $i)
    _FFTabClose($Socket, $i, "index")
    $i2 = $i
    ;_ArrayDisplay($aBefehle,"Delete",-1,0,"",",")
    ExitLoop (2)
    EndIf
    WEnd
    Next
    ;WEnd
    EndFunc ;==>_DS_FFExecuteCommands
    Func _WriteFFAction($sAction, $sOption = "", $iDelay = 0)
    Return '_FFAction($sAction = "' & $sAction & '", $sOption = "' & $sOption & '", $iDelay = ' & $iDelay & ')|'
    EndFunc ;==>_WriteFFAction
    Func _WriteFFClick($sObject, $iTabIndex = -1)
    Return '_FFClick($sObject = "' & $sObject & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFClick
    Func _WriteFFClickImage($vSearch, $sMode = "src", $iTabIndex = -1)
    Return '_FFClickImage($vSearch = "' & $vSearch & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFClickImage
    Func _WriteFFClickImageBySize($iHeight, $iWidth, $sMode = "eq", $sTarget = "_blank", $iTabIndex = -1)
    Return '_FFClickImageBySize($iHeight = ' & $iHeight & ', $iWidth = ' & $iWidth & ', $sMode = "' & $sMode & '", $sTarget = "' & $sTarget & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFClickImageBySize
    Func _WriteFFClickLink($vSearch, $sMode = "href", $iTabIndex = -1)
    Return '_FFClickLink($vSearch = "' & $vSearch & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFClickLink
    Func _WriteFFFrameLeave()
    Return '_FFFrameLeave()|'
    EndFunc ;==>_WriteFFFrameLeave
    Func _WriteFFFrameEnter($vFrame, $sMode = "index", $iTabIndex = -1)
    Return '_FFFrameEnter($vFrame = "' & $vFrame & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFFrameEnter
    Func _WriteFFFormCheckBox($sName, $bChecked = True, $iIndex = 0, $sBMode = "index", $vForm = 0, $sMode = "index", $iTabIndex = -1)
    Return '_FFFormCheckBox($sName = "' & $sName & '", $bChecked = ' & $bChecked & ', $iIndex = ' & $iIndex & ', $sBMode = "' & $sBMode & '", $vForm = "' & $vForm & '", $sMode = "' & $sMode & '" , $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFFormCheckBox
    Func _WriteFFFormRadioButton($vRadioButton, $iIndex = 0, $sBMode = "index", $vForm = 0, $sMode = "index", $iTabIndex = -1)
    Return '_FFFormRadioButton($vRadioButton = "' & $vRadioButton & '", $iIndex = ' & $iIndex & ', $sBMode = "' & $sBMode & '", $vForm = "' & $vForm & '", $sMode = "' & $sMode & '" , $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFFormRadioButton
    Func _WriteFFFormReset($vForm, $sMode = "index", $iTabIndex = -1)
    Return '_FFFormReset($vForm = "' & $vForm & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFFormReset
    Func _WriteFFFormSubmit($vForm = 0, $sMode = "index", $iTabIndex = -1)
    Return '_FFFormSubmit($vForm = "' & $vForm & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFFormSubmit
    Func _WriteFFGetValueById($sID, $iTabIndex = -1)
    Return '_FFGetValueById($sID = "' & $sID & '", $iTabIndex = ' & $iTabIndex & ')'
    EndFunc ;==>_WriteFFGetValueById
    Func _WriteFFGetValueByName($sName, $iIndex = 0, $iTabIndex = -1)
    Return '_FFGetValueByName($sName = "' & $sName & '", $iIndex = ' & $iIndex & ', $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFGetValueByName
    Func _WriteFFKeyPress($iKeyCode, $iTabIndex = -1)
    Return '_FFKeyPress($iKeyCode = ' & $iKeyCode & ', $iTabIndex = ' & $iTabIndex & ')'
    EndFunc ;==>_WriteFFKeyPress
    Func _WriteFFLoadWait($iDelay = 0, $iTimeOut = 10000, $iPercent = 100)
    Return '_FFLoadWait($iDelay = ' & $iDelay & ', $iTimeOut = ' & $iTimeOut & ', $iPercent = ' & $iPercent & ')|'
    EndFunc ;==>_WriteFFLoadWait
    Func _WriteFFOpenURL($sURL, $iTabIndex = -1, $bWait = False)
    Return '_FFOpenURL($sURL = "' & $sURL & '", $iTabIndex = ' & $iTabIndex & ', $bWait = ' & $bWait & ')|'
    EndFunc ;==>_WriteFFOpenURL
    Func _WriteFFSetGet($sArg, $iTimeOut = 10000, $iTabIndex = -1)
    Return '_FFSetGet($sArg = "' & $sArg & '", $iTimeOut = ' & $iTimeOut & ', $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFSetGet
    Func _WriteFFSetValueById($sID, $sValue = "", $iTabIndex = -1)
    Return '_FFSetValueById($sID = "' & $sID & '", $sValue = "' & $sValue & '", $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFSetValueById
    Func _WriteFFSetValueByName($sName, $sValue = "", $iIndex = 0, $iTabIndex = -1)
    Return '_FFSetValueByName($sName = "' & $sName & '", $sValue = "' & $sValue & '", $iIndex = ' & $iIndex & ', $iTabIndex = ' & $iTabIndex & ')|'
    EndFunc ;==>_WriteFFSetValueByName
    Func _WriteFFTabAdd($sURL = "about:blank", $bSelect = True)
    Return '_FFTabAdd($sURL = "' & $sURL & '", $bSelect = ' & $bSelect & ')|'
    EndFunc ;==>_WriteFFTabAdd
    Func _WriteFFTabClose($vTab = -1, $sMode = "index")
    Return '_FFTabClose($vTab = ' & $vTab & ', $sMode = "' & $sMode & '")|'
    EndFunc ;==>_WriteFFTabClose
    Func _WriteFFTabCloseAll()
    Return '_FFTabCloseAll()'
    EndFunc ;==>_WriteFFTabCloseAll
    Func _WriteFFTabSelect($sMode = "index", $vTab = 0)
    Return '_FFTabSelect($sMode = "' & $sMode & '", $vTab = ' & $vTab & ')|'
    EndFunc ;==>_WriteFFTabSelect

    [/autoit]

    Ich hoffe ihr könnt mir helfen :rolleyes:

    Hab mal ein überarbeitetes Beispiel angehängt...

    Antwort:
    Modifizierte FF.au3 (Integer-Funktion durch StringIsInt ersetzt)
    Und viele viele Stunden ^^
    autoit.de/wcf/attachment/3946/ <-- modifizierte FF.au3 und Beispiel
    Siehe Spoiler und Beispiel für Erklärung ;)

    4 Mal editiert, zuletzt von JoEtHeKiLlEr (15. Februar 2009 um 00:08)