Abfrage Problem

  • Hi,

    ich habe folgendes Problem, das bei einer größer - kleiner Abfrage immer das gleiche Ergebnis geliefert wird.
    Da ich es schon mit mehreren Varianten durchgetested habe wollte ich wissen ob ich ein Fehler mache oder
    AutoIT das nicht richtig umsetzt

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.2.9.1 (beta)
    Author: Mirage

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here
    #region ~Includes - Declarations - Options
    #include
    #include
    #include
    #include

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

    Opt("GuiOnEventMode",1)
    Opt("WinTitleMatchMode",4)
    Opt("WinSearchChildren",0)
    Global $pr_list, $pid_atg = 0, $pid_atgnew = 0
    Global $i_ref = 0
    Global $title = "ProWin Control 1.0"
    Global $pr_win_list[1][6], $i_pr_wi = 0, $ar_time[1][11]
    Global $time_act = 0, $time_index, $time_int
    Global $dis_day, $dis_hour,$dis_min,$dis_sec
    Global $Force
    #endregion ~Includes - Declarations - Options

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

    #region ~GUI - Presettings
    $g_main = GUICreate($title,500,600,@DesktopWidth / 2 - 300, @DesktopHeight / 2 - 300)
    $g_prlist = GUICtrlCreateList("",0,20,290,300,BitOR($WS_BORDER, $WS_VSCROLL, $WS_HSCROLL))
    $g_refresh = GUICtrlCreateButton("Refresh List",310,20,90,20)
    $g_add = GUICtrlCreateButton("Add Process", 310,60,90,20)
    $g_close = GUICtrlCreateButton("Close Process", 310,100,90,20)
    $g_closetime = GUICtrlCreateButton("Close on Time",310, 290,90,20)
    $g_showwin = GUICtrlCreateButton("Show Window",310,140,90,20)
    $g_hidewin = GUICtrlCreateButton("Hide Window",310,180,90,20)
    $g_chname = GUICtrlCreateButton("Change Window Name",310,220,120,20)

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

    GUICtrlSetOnEvent($g_chname,"_ChangeName")
    GUICtrlSetOnEvent($g_hidewin,"_HideWin")
    GUICtrlSetOnEvent($g_showwin,"_ShowWin")
    GUICtrlSetOnEvent($g_closetime,"_CloseTime")
    GUICtrlSetOnEvent($g_refresh,"_Refresh")
    GUICtrlSetOnEvent($g_add,"_AddProcess")
    GUICtrlSetOnEvent($g_close,"_CloseProcess")
    GUISetOnEvent(-3,"_Exit",$g_main)

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

    $g_prcllist = GUICtrlCreateList("",0,340,290,240,BitOR($WS_BORDER, $WS_VSCROLL, $WS_HSCROLL))
    $g_prcledit = GUICtrlCreateButton("Edit Process Time", 310,340,90,20)

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

    GUICtrlCreateLabel("Next Application to close:",310,450,130,20)
    $g_appname = GUICtrlCreateLabel("",310,475,180,20)
    GUICtrlCreateLabel("Time Left:",310,500,50,20)
    $g_apptimer = GUICtrlCreateLabel("00:00:00",370,500)

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

    AdlibEnable("_Refresh",1000)

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

    _Refresh(0)

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

    GUISetState(@SW_SHOW,$g_main)
    #endregion ~GUI - Presettings

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

    #region ~Functions

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Refresh($Force)

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

    $bkp_list = $pr_list
    $pid_atgnew = 0
    $pr_list = ProcessList()
    $win_list = WinList()
    For $i = 1 To UBound($pr_list) - 1
    $pid_atgnew = $pid_atgnew + $pr_list[$i][1]
    Next
    $pid_atgnew = $pid_atgnew + $win_list[0][0]
    If $Force = 1 Then
    Else
    If $pid_atgnew = $pid_atg Then
    Return
    EndIf
    EndIf

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

    ReDim $pr_win_list[1][6]
    $i_pr_wi = 0
    $pid_atg = 0
    GUICtrlSetData($g_prlist,"")
    For $i = 1 To UBound($pr_list) - 1
    $win_ava = ""
    $pro_ava = ""
    If $pr_list[$i][1] = 0 Then
    Else
    $i_pr_wi = $i_pr_wi + 1
    ReDim $pr_win_list[$i_pr_wi + 1][6]
    $pro_ava = " -- PID "
    $pr_win_list[$i_pr_wi][0] = $pr_list[$i][1]
    $pr_win_list[$i_pr_wi][1] = $pr_list[$i][0]
    $pr_win_list[$i_pr_wi][4] = $pr_win_list[$i_pr_wi][4] + 1
    $pid_atg = $pid_atg + $pr_list[$i][1]

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

    For $a = 1 To UBound($win_list) - 1
    If WinGetProcess($win_list[$a][0]) = $pr_list[$i][1] Then
    $win_ava = " -- WIN"
    $pr_win_list[$i_pr_wi][2] = $win_list[$a][0]
    $pr_win_list[$i_pr_wi][4] = $pr_win_list[$i_pr_wi][4] + 2
    $pr_win_list[$i_pr_wi][5] = $win_list[$a][1]
    ExitLoop
    EndIf
    Next
    $pr_win_list[$i_pr_wi][3] = $pr_list[$i][0] & $win_ava & $pro_ava & $pr_list[$i][1]
    GUICtrlSetData($g_prlist,$pr_win_list[$i_pr_wi][3])

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

    EndIf

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

    Next
    For $i = 1 To UBound($win_list) - 1
    $win_exi = 0
    For $a = 1 To UBound($pr_win_list) - 1
    If $win_list[$i][1] = $pr_win_list[$a][5] Then
    $win_exi = 1
    ExitLoop
    Else
    EndIf
    Next
    If $win_exi = 0 Then
    For $a = 1 To UBound($pr_win_list) - 1
    If WinGetProcess($win_list[$i][1]) = $pr_win_list[$a][0] And WinGetProcess($win_list[$i][1]) <> 0 Then
    $win_exi = 1
    ExitLoop
    Else
    EndIf
    Next
    EndIf
    If $win_exi = 0 Then
    $i_pr_wi = $i_pr_wi + 1
    ReDim $pr_win_list[$i_pr_wi + 1][6]
    $pr_win_list[$i_pr_wi][2] = $win_list[$i][0]
    $pr_win_list[$i_pr_wi][4] = $pr_win_list[$i_pr_wi][4] + 4
    $pr_win_list[$i_pr_wi][5] = $win_list[$i][1]
    $pr_win_list[$i_pr_wi][3] = "No Process -- " & $pr_win_list[$i_pr_wi][2] & " -- HWnd " & $pr_win_list[$i_pr_wi][5]
    GUICtrlSetData($g_prlist,$pr_win_list[$i_pr_wi][3])

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

    EndIf
    Next
    $pid_atg = $pid_atg + $win_list[0][0]

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

    ;~ _ArrayDisplay($pr_win_list)
    EndFunc

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

    Func _AddProcess()
    $pr_open = FileOpenDialog($title,"","Executable Files (*.exe;*.com;*.bat;.tif)")
    If @error Then
    Return
    EndIf
    $file_path = ""
    $ar_filesplit = StringSplit($pr_open,"\")
    $file_name = $ar_filesplit[$ar_filesplit[0]]
    For $i = 1 To UBound($ar_filesplit) - 2
    $file_path = $file_path & $ar_filesplit[$i] & "\"
    Next
    Run($file_name,$file_path)
    EndFunc

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

    Func _CloseProcess()
    $g_prlist_index = _GUICtrlListGetCaretIndex($g_prlist)

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

    If _GUICtrlListGetText($g_prlist,$g_prlist_index) = - 1 Then
    Return
    EndIf

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

    $msgbox = MsgBox(266276,$title,"Are you sure that you want to close the process: " & _GUICtrlListGetText($g_prlist,$g_prlist_index) & " ?")

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

    If $msgbox = 7 Then
    Else
    For $i = 1 To UBound($pr_win_list) -1
    If StringInStr(_GUICtrlListGetText($g_prlist,$g_prlist_index),$pr_win_list[$i][3]) Then
    $pr_index = $i
    EndIf
    Next
    If $pr_index = 0 Then Return MsgBox(0,$title,"Unexcepted Error!")
    If $pr_win_list[$pr_index][4] = 4 Then
    WinClose($pr_win_list[$pr_index][5])
    EndIf
    ProcessClose($pr_win_list[$pr_index][0])
    EndIf
    EndFunc

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

    Func _ShowWin()
    $win_index = 0
    $g_prlist_index = _GUICtrlListGetCaretIndex($g_prlist)
    For $i = 1 To UBound($pr_win_list) -1
    If StringInStr(_GUICtrlListGetText($g_prlist,$g_prlist_index),$pr_win_list[$i][3]) Then
    $win_index = $i
    EndIf
    Next
    If $win_index = 0 Then Return MsgBox(0,$title,"Unexcepted Error!")
    If $pr_win_list[$win_index][4] = 1 Then Return MsgBox(0,$title,"This Process don't have any Window")
    WinSetState($pr_win_list[$win_index][5],"",@SW_SHOW)

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

    EndFunc

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

    Func _HideWin()
    $win_index = 0
    $g_prlist_index = _GUICtrlListGetCaretIndex($g_prlist)
    For $i = 1 To UBound($pr_win_list) -1
    If StringInStr(_GUICtrlListGetText($g_prlist,$g_prlist_index),$pr_win_list[$i][3]) Then
    $win_index = $i
    EndIf
    Next
    If $win_index = 0 Then Return MsgBox(0,$title,"Unexcepted Error!")
    If $pr_win_list[$win_index][4] = 1 Then Return MsgBox(0,$title,"This Process don't have any Window")
    WinSetState($pr_win_list[$win_index][5],"",@SW_HIDE)

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

    EndFunc

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

    Func _ChangeName()
    $win_index = 0
    $g_prlist_index = _GUICtrlListGetCaretIndex($g_prlist)
    For $i = 1 To UBound($pr_win_list) -1
    If StringInStr(_GUICtrlListGetText($g_prlist,$g_prlist_index),$pr_win_list[$i][3]) Then
    $win_index = $i
    EndIf
    Next
    If $win_index = 0 Then Return MsgBox(0,$title,"Unexcepted Error!")
    If $pr_win_list[$win_index][4] = 1 Then Return MsgBox(0,$title,"This Process don't have any Window")
    $input = InputBox($title,"Please enter a new name for the window" & @CRLF & $pr_win_list[$win_index][2],$pr_win_list[$win_index][2])
    If @error Then Return
    WinSetTitle($pr_win_list[$win_index][5],"",$input)
    _Refresh(1)

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

    EndFunc

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

    Func _CloseTime()
    $win_index = 0
    $shutdown = 0
    $g_prlist_index = _GUICtrlListGetCaretIndex($g_prlist)
    For $i = 1 To UBound($pr_win_list) -1
    If StringInStr(_GUICtrlListGetText($g_prlist,$g_prlist_index),$pr_win_list[$i][3]) Then
    $win_index = $i
    EndIf
    Next
    If $win_index = 0 Then Return MsgBox(0,$title,"Unexcepted Error!")

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

    $inputtime = InputBox($title,"Please enter how many time to elapse for closing the process "& @CRLF & _GUICtrlListGetText($g_prlist,$g_prlist_index) & @CRLF & "(Hours:Minutes:Seconds)","00:00:00",Default,330,Default)
    If @error Then Return
    $requshut = MsgBox(266276,$title,"Do you want to automatically shut down the PC after count down?")
    If $requshut = 6 Then $shutdown = 1
    $time_split = StringSplit($inputtime,":")
    If $time_split[0] <> 3 Then Return MsgBox(0,$title,"Invalid Value!")
    If StringIsDigit($time_split[1]) = 0 Or StringIsDigit($time_split[2]) = 0 Or StringIsDigit($time_split[3]) = 0 ThenReturn MsgBox(0,$title,"Invalid Value!")
    If $time_split[2] > 60 Or $time_split[3] > 60 Then Return MsgBox(0,$title,"Invalid Value!")
    $time_inms = 0
    $time_inms = $time_inms + $time_split[3] * 1000 + $time_split[2] * 60000 + $time_split[1] * 3600000
    If $time_inms = 0 Then Return MsgBox(0,$title,"Invalid Value!")
    $time_index = UBound($ar_time) - 1
    ReDim $ar_time[UBound($ar_time) + 1][11]

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

    For $i = 0 To 5
    $ar_time[$time_index + 1][$i] = $pr_win_list[$win_index][$i]
    Next

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

    $ar_time[$time_index + 1][6] = $time_inms
    $ar_time[$time_index + 1][7] = TimerInit() + $time_inms
    $ar_time[$time_index + 1][8] = $shutdown
    $ar_time[$time_index + 1][9] = 0
    _TicksToTimeMod(_TimeToTicks(@HOUR,@MIN,@SEC) + $ar_time[$time_index + 1][6], $dis_day, $dis_hour, $dis_min, $dis_sec)
    GUICtrlSetData($g_prcllist,$ar_time[$time_index + 1][3] & " Close at: " & $dis_day & " Day " & StringFormat("%02i:%02i:%02i", $dis_hour - $dis_day * 24,$dis_min,$dis_sec) )
    $ar_time[$time_index + 1][10] = $dis_day & "|" & $dis_hour & "|" & $dis_min & "|" & $dis_sec
    $ontop = 0
    $dummy = TimerInit()
    If UBound($ar_time) = 2 Then
    $ar_time[$time_index + 1][9] = 1
    $time_int = 1
    Else
    If $ar_time[$time_index +1][7] > $ar_time[$time_int][7] Then
    ;~ MsgBox(0,"halo",$time_int & "|" & $time_index + 1 )
    Else
    ;~ MsgBox(0,"halo",$time_int & "|1" & $time_index + 1 )
    $ar_time[$time_index +1][9] = 1
    $ar_time[$time_int][9] = 0
    $time_int = $time_index + 1
    EndIf
    EndIf

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

    _ArrayDisplay($ar_time)

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

    EndFunc

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

    Func _TicksToTimeMod($iTicks,ByRef $iDays, ByRef $iHours, ByRef $iMins, ByRef $iSecs)
    If Number($iTicks) > 0 Then
    $iTicks = Round($iTicks / 1000)
    $iHours = Int($iTicks / 3600)
    $iTicks = Mod($iTicks, 3600)
    $iMins = Int($iTicks / 60)
    $iSecs = Round(Mod($iTicks, 60))
    ; If $iHours = 0 then $iHours = 24
    $iDays = Int($iHours / 24)
    Return 1
    ElseIf Number($iTicks) = 0 Then
    $iHours = 0
    $iTicks = 0
    $iMins = 0
    $iSecs = 0
    Return 1
    Else
    SetError(1)
    Return 0
    EndIf
    EndFunc ;==>_TicksToTime

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

    #endregion ~Functions

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

    While 1

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

    If $time_act = 0 Then
    Else

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

    EndIf

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

    Sleep(10)
    WEnd

    [/autoit]

    Das Problem liegt in den Zeilen 277 - 300


    Mit freundlichen Gruß


    ~Mirage</date.au3></array.au3></guilist.au3></guiconstants.au3>

    Einmal editiert, zuletzt von Mirage (9. Februar 2008 um 16:26)

  • Ich kann das schon :thumbup:
    Ist auch egal wieso, Mirage sollte beim nächsten mall einfach auf Vorschau klicken bevor er postet.

  • Ich wüsste nicht was an diesem Vergleich falsch sein sollte, da ja die Werte eine klare Funktion haben und unterschiedliche Quellen benutzen.

    Wahrscheinlich habe ich mein Anliegen auch nicht passend geschrieben.

    Das Problem leite ich mir davon ab, dass InitTimer() nicht schon bereits in Millisekunden umgerechnet wird, sondern die blanke Taktfrequenz
    abgefragt wird (insofern es vom clockcounter abgelesen wird), somit sind die Werte nicht addierbar.

    -> Problem gelöst

  • Stimmt, es gibt da aber einen festen Multiplikator, den man verwenden kann. Habe aber das Script gerade nciht zur Hand, in dem ich das gemacht habe. Um den Multi zu ermitteln kann man 2 Timer im Abstand einer Sekunde initialisieren und die Initwerte vergleichen. Hat damals für meine Anforderungen gereicht, auch wenn es nicht ganz genau ist.

    Gruß,

    TrueMu

  • So könnte man es machen:

    Spoiler anzeigen
    [autoit]

    $Count = 4 ;Durchläufe
    $enddiff = 0
    For $i = 1 To $Count
    $timer = TimerInit()
    Sleep(500)
    $timer1 = TimerInit()
    Sleep(1000)
    $timer2 = TimerInit()
    Sleep(2000)
    $timer3 = TimerInit()
    Sleep(4000)
    $timer4 = TimerInit()
    $sekunde1 = 2*($timer-$timer1)
    $sekunde2 = $timer2 - $timer1
    $sekunde3 = ($timer3 - $timer1) / 2
    $sekunde4 = ($timer4 - $timer3) / 4
    $diff = (($sekunde1+$sekunde2+$sekunde3+$sekunde4)/4)
    $enddiff += $diff
    ConsoleWrite($diff & @LF)
    Next
    ConsoleWrite("Ergebnis: " & ($enddiff/($i-1)) & @LF)
    InputBox("Ergebnis","Frequenz: Ticks pro Sekunde",($enddiff/($i-1)))

    [/autoit]


    Ich komme dann auf 1 Sekunde = 1258069739.96875