1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. alpines

Beiträge von alpines

  • Prozessliste mit Namen erstellen

    • alpines
    • 26. Juli 2017 um 20:19
    Zitat von Musashi

    Von der Geschwindigkeit her, sehe ich keinen wesentlichen Unterschied. Zumindest ist _ArrayAdd aber nicht gewaltig schneller - warum auch.

    Ich persönlich bevorzuge lieber die selbstgemachte ReDim-Variante, einfach aus Gewohnheit (und ich spare mir eine UDF).
    In deinem Beispiel ist ReDim (3739ms) 200ms schneller (~8%), da man jedes Mal den anderen Kram aus der UDF nicht durchgeht sondern wirklich nur das Array bearbeitet.
    Soll jeder es so machen wie er es am besten kann und wie er es am besten findet. 200ms sind nun wirklich kein Beinbruch.

    Zitat von AspirinJunkie

    Wenig überraschend skalieren beide gleich da ArrayAdd ja nix anderes als ein verpacktes ReDim ist.
    Da das umkopieren mit steigender Arraygröße immer aufwendiger wird ist die Skalierung exponentiell.

    War auch nicht anders zu erwarten, es kommt halt immer der konstante Teil von den Überprüfungen und dem ganzen drumherum dazu.
    Bei 5000 Elementen sind das schon 200ms Unterschied bei 3739-3915ms.

  • Prozessliste mit Namen erstellen

    • alpines
    • 26. Juli 2017 um 18:40
    Zitat von autoiter

    Bei mir ist _ArrayAdd immer schneller, als ReDim.

    Guck mal in _ArrayAdd rein, dass die Funktion bei dir schneller ist der Grund den ich bereits beschrieben hatte. Zufall.

  • Prozessliste mit Namen erstellen

    • alpines
    • 26. Juli 2017 um 17:38
    Zitat von Musashi

    Bei Abläufen im ms Bereich natürlich nicht 100% aussagekräftig

    Ich würde lieber die Relation zwischen den beiden betrachten und wie sich das auf größere Aufgaben skaliert.
    Bei kleinen Aufgaben ist das natürlich völlig irrelevant.

  • Prozessliste mit Namen erstellen

    • alpines
    • 26. Juli 2017 um 16:02
    Zitat von olfibits

    klemm dir das ReDim, und mach es mit _ArrayAdd
    geht vielleicht schneller

    Wie kommst du denn darauf? _ArrayAdd hat ziemlich viel Extra-Schnickschnack drum und basiert im Kern auch auf die ReDim-Funktion.
    Warum sollte ich also das ganze Extrazeugs mitausführen (und eine UDF includen) obwohl ich das einfach ReDimmen kann?

    Tests liefern auch das gleiche Resultat, _ArrayAdd ist im Schnitt wenige Millisekunden langsamer als das selbstgemachte ReDim und nur in sehr seltenen Fällen schneller (das liegt aber am Interpreter, an der CPU, Scheduler und alles was noch so dran hängt).

    AutoIt
    #include <Array.au3>
    
    
    $tmr1 = TimerInit()
    $aWin = processlist()
    $c = 0
    Dim $aList[0][3]
    
    
    for $i = 0 to ubound($aWin)-1
    	$sWin = _Process2Win($aWin[$i][1])
    	if $sWin <> -1 then
    		$c = $c + 1
    		ReDim $aList[$c][3]
    		$aList[$c-1][0] = $aWin[$i][0]
    		$aList[$c-1][1] = $aWin[$i][1]
    		$aList[$c-1][2] = $sWin
    	EndIf
    Next
    ConsoleWrite(TimerDiff($tmr1) & @CRLF)
    _Arraydisplay($aList)
    
    
    $tmr2 = TimerInit()
    $aWin = processlist()
    $c = 0
    Dim $aList[0][3]
    
    
    for $i = 0 to ubound($aWin)-1
    	$sWin = _Process2Win($aWin[$i][1])
    	if $sWin <> -1 then
    		$c = $c + 1
    		_ArrayAdd($aList, $aWin[$i][0] & "|" & $aWin[$i][1] & "|" & $sWin)
    	EndIf
    Next
    ConsoleWrite(TimerDiff($tmr2) & @CRLF)
    _ArrayDisplay($aList)
    
    
    Func _Process2Win($pid)
        If IsString($pid) Then $pid = ProcessExists($pid)
        If $pid = 0 Then Return -1
        Local $list = WinList(), $wpid
        For $i = 1 To $list[0][0]
            If $list[$i][0] <> "" AND BitAnd(WinGetState($list[$i][1]),2) Then
                $wpid = WinGetProcess($list[$i][0])
                If $wpid = $pid Then Return $list[$i][0]
            EndIf
        Next
        Return -1
    EndFunc  ;==> Quelle: https://autoit.de/index.php/Thread/85367-Schleife-bis-R%C3%BCckgabewert-passt/?postID=683725&highlight=_Process2Win%2528%2524pid%2529
    Alles anzeigen
  • Prozessliste mit Namen erstellen

    • alpines
    • 26. Juli 2017 um 13:27

    Die Anwendungsübersicht zeigt dir die Fenster an die offen sind, diese kriegst du mit WinList, dem Äquivalent zu ProcessList.

  • Active Directory Funktionen - Neue Version 1.5.0.0 freigegeben!

    • alpines
    • 26. Juli 2017 um 12:18
    Zitat von chrissi

    habe jetzt schon einiges mit der _ExcelSortExtended probiert aber ich bekomme leider nicht das gewünschte Ergebnis

    Zeig uns doch mal was und wie du es probiert hast.

  • Daten aus einem DOS Fenster in ein Array übertragen und bearbeiten

    • alpines
    • 25. Juli 2017 um 14:09

    Schreib doch die neue Zahl dann in den 0. Index rein? Wo liegt das Problem?

  • Daten aus einem DOS Fenster in ein Array übertragen und bearbeiten

    • alpines
    • 25. Juli 2017 um 11:17
    Zitat von AspirinJunkie

    Ah - Aufgabe falsch verstanden

    Die RegEx-Variante funktioniert aber, und die ist ehrlich gesagt auch schöner. Fragt sich nur ob der TE die nachvollziehen kann.
    Wenn man den Output auch direkt holt spart man sich den Umweg über das Dateisystem.

  • Daten aus einem DOS Fenster in ein Array übertragen und bearbeiten

    • alpines
    • 25. Juli 2017 um 11:12
    Zitat von AspirinJunkie

    Ja wie gesagt - wenn es schon als Array vorliegt durchgehen und per StringLeft extrahieren:

    Bei dieser Variante hast du vergessen die Zeilen rauszuschmeißen die ein 'e' vorne dran haben.

  • Daten aus einem DOS Fenster in ein Array übertragen und bearbeiten

    • alpines
    • 25. Juli 2017 um 11:07

    Das müsste in etwa so klappen, beachte die Indizes und baue sie für dein Skript um!

    AutoIt
    #include <Array.au3>
    
    
    Local $aArray[5][2] = [["", 802], ["", "Usage data is 8 minutes old. Next update in 8 minutes."], _
    					   ["", ""], ["", "e1234567 XDT_PLT_UD 2018.1231"], ["", "1231224 XDT_PLT_UD 2018.1231"]]
    
    
    ;Indizes müssen angepasst werden, das hier ist nur ein Testskript!
    _ArrayDisplay($aArray, "Davor")
    
    
    For $i = 3 To 4
    	If StringLeft($aArray[$i][1], 1) = "e" Then
    		$aArray[$i][1] = StringLeft($aArray[$i][1], 1 + 7)
    	Else
    		$aArray[$i][1] = ""
    	EndIf
    Next
    
    
    _ArrayDisplay($aArray, "Danach")
    Alles anzeigen
  • Genial einfaches Tool zur Web Recherche - Smartclip

    • alpines
    • 25. Juli 2017 um 07:33

    Deshalb backupt man die alte Version in einen Ordner und arbeitet an einer Kopie.

    Jetzt weißt du es für die Zukunft besser.

  • RUN mit Parameter

    • alpines
    • 24. Juli 2017 um 18:21

    Es liegt an deiner Zeichensetzung weshalb es nicht funktioniert, bei deinen ersten beiden Beispielen schreibst du ein ' mit rein obwohl es fehl am Platze ist.
    Probiers mal damit:

    AutoIt
    $sPathAcrobat = '"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"'
    $sParams = "/s /o /t"
    $sPdfPath = '"D:\Daten\LaTeX\Tagesplan.pdf"'
    $sPrinterName = "ARS5-HP"
    
    
    Run($sPathAcrobat & " " & $sParams & " " & $sPdfPath & " " & $sPrinterName)
  • GUI Delete Column error

    • alpines
    • 24. Juli 2017 um 10:43

    @AspirinJunkie wird die Dummyspalte automatisch erzeugt? Laut Dokumentation dürfte nach deinem Beispiel, wenn man es manuell machen soll, es eigentlich nicht funktionieren.

    Falls die erste Spalte trotzdem gelöscht werden soll, so ist eine Spalte mit der Breite 0 als Dummy einzufügen und anschließend die gewünschte Spalte zu löschen

    In der englischen Dokumentation taucht von diesem Verhalten kein einziger Satz auf.

  • GUI Delete Column error

    • alpines
    • 24. Juli 2017 um 10:39

    Ein kleiner Blick in die Dokumentation von _GUICtrlListView_DeleteColumn liefert auch die Antwort.

    Zitat von _GUICtrlListView_DeleteColumn

    Die erste Spalte (Index 0) eines ListView-Controls kann nicht gelöscht werden.

  • Gamepad als maus ersatz

    • alpines
    • 22. Juli 2017 um 18:48

    Ja das geht, dazu gibts auch eine UDF im englischen Forum die schon etwas älter ist, hab sie angepasst an die aktuelle AutoIt-Version:

    AutoIt
    ;____________________________________________________________________
    ;       Original program by Ejoc                                    ;
    ;       Improved by Adam1213 (autoit 3.2 compatiblity + improved labels         ;
    ;____________________________________________________________________
    
    
    #include <GUIConstants.au3>
    
    
    ;_________________ SETUP_____________________________________
    Local $joy,$coor,$h,$s,$msg
    
    
    $joy    = _JoyInit()
    
    
    dim $labels_text[8]=['X', 'Y', 'Z', 'R', 'U', 'V', 'POV', 'Buttons']
    dim $labels_no=UBound($labels_text)
    dim $labels[$labels_no]
    dim $labels_value[$labels_no]
    ;__________ CONFIG ____________________________________________
    ;---------- Find the max length of the longest label --------------
    $label_len=0
    for $text in $labels_text
        $len=stringlen($text)
        if $len>$label_len then
            $label_len=$len
        endif
    next
    $label_len*=6
    ;_____________ GUI _______________________________________________
    GUICreate('Joystick Test', 200, 200)
    GUICtrlCreateLabel('Joystick', 40, 20, 100, 20)
    
    
    for $i=0 to $labels_no-1
        GuiCtrlCreatelabel($labels_text[$i]&':', 10, 60+$i*12, $label_len, 12)
        $labels[$i]=GuiCtrlCreatelabel('', 10+$label_len, 60+$i*12, 70, 12)
        $labels_value[$i]=''
    next
    GUISetState()
    ;_____________________________________________________________________
    
    
    while 1
        $coord=_GetJoy($joy,0)
        for $i=0 to UBound($coord)-1
            if $coord[$i]<>$labels_value[$i] then
                GUICtrlSetData($labels[$i], $coord[$i])
                $labels_value[$i]=$coord[$i]
            endif
        next
        sleep(10)
        $msg =GUIGetMSG()
        if $msg = $GUI_EVENT_CLOSE Then Exitloop
    WEnd
    
    
    $lpJoy=0 ; Joyclose
    
    
    ;======================================
    ;   _JoyInit()
    ;======================================
    Func _JoyInit()
        Local $joy
        Global $JOYINFOEX_struct    = "dword[13]"
    
    
        $joy=DllStructCreate($JOYINFOEX_struct)
        if @error Then Return 0
        DllStructSetData($joy, 1, DllStructGetSize($joy), 1);dwSize = sizeof(struct)
        DllStructSetData($joy, 1, 255, 2)              ;dwFlags = GetAll
        return $joy
    EndFunc
    
    
    ;======================================
    ;   _GetJoy($lpJoy,$iJoy)
    ;   $lpJoy  Return from _JoyInit()
    ;   $iJoy   Joystick # 0-15
    ;   Return  Array containing X-Pos, Y-Pos, Z-Pos, R-Pos, U-Pos, V-Pos,POV
    ;           Buttons down
    ;
    ;           *POV This is a digital game pad, not analog joystick
    ;           65535   = Not pressed
    ;           0       = U
    ;           4500    = UR
    ;           9000    = R
    ;           Goes around clockwise increasing 4500 for each position
    ;======================================
    Func _GetJoy($lpJoy,$iJoy)
        Local $coor,$ret
    
    
        Dim $coor[8]
        DllCall("Winmm.dll","int","joyGetPosEx", _
                "int",$iJoy, _
                "ptr",DllStructGetPtr($lpJoy))
    
    
        if Not @error Then
            $coor[0]    = DllStructGetData($lpJoy,1,3)
            $coor[1]    = DllStructGetData($lpJoy,1,4)
            $coor[2]    = DllStructGetData($lpJoy,1,5)
            $coor[3]    = DllStructGetData($lpJoy,1,6)
            $coor[6]    = DllStructGetData($lpJoy,1,9)
            $coor[7]    = DllStructGetData($lpJoy,1,11)
        EndIf
    
    
        return $coor
    EndFunc
    Alles anzeigen
  • Genial einfaches Tool zur Web Recherche - Smartclip

    • alpines
    • 22. Juli 2017 um 14:57
    Zitat von autoiter

    Ich wollte auch mal so etwas ähnliches machen und wollte dazu auch die Clipboard UDF verwenden. Jedoch habe ich nicht geschnallt, wie man etwa mit Bildern umgeht und unterscheidet, dass es sich nicht etwa um eine kopierte Pfadangabe sondern tatsächlich um eine Bilddatei handelt.

    Du schaust einfach was drinne steht, wenn du einen String hast, dann ist es doch der Pfad. Sollte eine Bitmap drinne gespeichert sein, so ist es ein Bild.

  • Fenster(titel) "zweifelsfrei" ermitteln?

    • alpines
    • 21. Juli 2017 um 21:59

    Leerzeichen oder Whitespaces kannst du in regulären Ausdrücken mit \s angeben. Wenn du also <Leerzeichen>Zahl<Leerzeichen>(willst kannst du folgendes Pattern nehmen:
    \s\d+\s\( damit darf es allerdings nur ein Whitespace sein, bei mehreren einfach + dahinter setzen oder * falls keins auch vorkommen kann.
    Du kannst aber auch ein Leerzeichen einfügen  \d+ \(, das klappt auch. Nimmt dann aber nur die Whitespaces die dem eingegebenen entsprechen (also nur Leerzeichen, keine TABs, etc)
    Der Forum-Parser streicht das eine Leerzeichen vor dem \d+ also wunder dich nicht. Du kannst die Pattern hier gut testen: https://regex101.com/r/DgNvex/1

  • 1D Array in 2D Array splitten

    • alpines
    • 21. Juli 2017 um 21:47

    Ich nehme mal stark an, dass dein größter Performanceverlust die dauernden ReDims sind.
    Guck dir z.B. mal @AspirinJunkies DynArray UDF an, dort erstellt er Arrays die doppelt / dreifach so groß sind wie benötigt und kennzeichnet im Array wie befüllt es ist.
    So kannst du dir die etlichen ReDims sparen und statt beispielsweise 100 ReDims nur eins vornehmen.

  • Genial einfaches Tool zur Web Recherche - Smartclip

    • alpines
    • 21. Juli 2017 um 20:26
    Zitat von autoiter

    Ich denke du musst die <> Abfrage von der der Not-Abfrage abkapseln, da das zum Fehler führt.
    Also If (ClipGet() <> "") And Not _IsPressed("11", $hUser32) Then F_LinkCopy().

    Nein musst du nicht, die <, >, <=, >=, =, == haben eine höhere Präferenz und werden dem And vorgezogen. Du kannst hier die Klammern komplett weglassen.
    Das Not hingegen hat eine höhere Präferenz und sollte bei einigen Abfragen ausgeklammert werden.

    Beispiel: Not 5 = 2 ==> 0 = 2 ==> False Not (5 = 2) ==> Not False ==> True

  • Mehrere IE Fenster positionieren (WinMove) - klappt nicht!

    • alpines
    • 21. Juli 2017 um 11:47
    Zitat von lioput

    gibt es bekannte probleme mit winmove, etwas was ich immer berücksichtigen sollte?

    Nein eigentlich nicht, wenn du die Handles von der IE Funktion verwendest sollte das immer passen.

    Bei deiner ShellExecute Version habe ich immer verschiedene Handles für dasselbe Fenster bekommen und das ist mir bei der UDF-Variante nicht passiert.
    Ich setz das Thema nebenbei mal auf gelöst, du kannst das übrigens auch machen: 1. Beitrag bearbeiten, Threadstatus anpassen.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™