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. Bitnugger

Beiträge von Bitnugger

  • _GUICtrlListView_AddArray benötigt auf meinem Quad-Core 7x mehr Zeit als auf einem alten Dual-Core?!

    • Bitnugger
    • 19. Dezember 2018 um 23:49
    Zitat von Musashi

    Neuer ist nicht automatisch besser - das sollten gerade wir 'alten Säcke' wissen ;) .

    Ja, wobei ich aber sicher der ältere Sack bin! 8o

    Zitat von Musashi

    Was soll's, die wichtigste 'CPU' hat eh nur einen Kern, kein HT oder 'core-hopping' usw. Solange die läuft ist alles in Ordnung.

    Ja, du meinst sicher die CPU Brain_2.0... die hat bei mir auch nur einen zwei Kerne... (einer recht, der andere links) ist aber trotzdem multitaskingfähig! :rofl:

  • Kopiertool

    • Bitnugger
    • 19. Dezember 2018 um 23:40
    Zitat von autoiter

    Niemand muss es machen, aber wer Opt("MustDeclareVars", 1) benutzt, stellt sich so eine Frage nicht mehr, denn die Richtung ist die selbe.

    Stimmt...

    In größeren Scripts benutze ich allerdings nicht Opt("MustDeclareVars", 1) , sondern füge stattdessen folgende Zeile an den Anfang des Scripts ein:

    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7

    Das ist noch deutlich restriktiver als MustDeclareVars und es nervt auch ab und an gewaltig... aber andererseits hilft es ungemein dabei, "sauber" zu Programmieren!

  • Kopiertool

    • Bitnugger
    • 19. Dezember 2018 um 23:28
    Zitat von Musashi

    Ansonsten wird die -1 Notation garantiert irgendwo benutzt, wo sie nicht mehr passt :P .

    Stimmt auch wieder... du wirst mir langsam unheimlich... 8o

    Edit: Übrigens... wenn ich den dicken Daumen hätte, dann wärst du auch schon längst Poweruser! ;)

  • _GUICtrlListView_AddArray benötigt auf meinem Quad-Core 7x mehr Zeit als auf einem alten Dual-Core?!

    • Bitnugger
    • 19. Dezember 2018 um 23:20

    Ok, @Musashi,

    deine CPU ist um ein paar Klassen besser als meine und du hast ~10GB mehr RAM als ich... dein Ergebnis ist viel besser als auf meinem Quad-Core, aber nur minimal besser, als auf meinem antiken Dual-Core - ich bin total erstaunt!!!

  • Kopiertool

    • Bitnugger
    • 19. Dezember 2018 um 22:57

    Stimme @Musashi zu 100% zu...

    Zitat von Musashi

    Besser wäre :

    Hier kannst du allerdings auch -1 für das zuletzt erstellte Control verwenden...

    Global $ProjektDown

    Global $idEditProjektDown = GUICtrlCreateEdit("", 40, 168, 180, 40, BitOR ... )

    GUICtrlSetData(-1, "19")

    GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")

  • _GUICtrlListView_AddArray benötigt auf meinem Quad-Core 7x mehr Zeit als auf einem alten Dual-Core?!

    • Bitnugger
    • 19. Dezember 2018 um 22:38
    Zitat von alpines

    Sicher, dass es am Quadcore liegt und nicht an Windows 10?

    Bei einem Freund mit Quad-Core (auch i7 und WIN_10 X64) braucht es 234.178 ms - auch wenn nur noch 10% Speicher frei sind.


    Habe mal alles aus dem Autostart genommen und das AV Programm deaktiviert... RAMDISK geleert (0,7 GB)... freier Speicher ist dann bei 65%... macht dann etwa 2 Sekunden weniger!

    Dafür habe ich mir aber ganz sicher keinen Quad-Core i7 gekauft... da fahre ich ja mit dem antiken Mini-Dual-Core besser... das kann doch nicht wahr sein...

  • _GUICtrlListView_AddArray benötigt auf meinem Quad-Core 7x mehr Zeit als auf einem alten Dual-Core?!

    • Bitnugger
    • 19. Dezember 2018 um 21:53

    Ich habe hier mal das Test-Script hinzugefügt und auch die Zeiten, die _GUICtrlListView_AddArray bei mir benötigt, sowie Infos zu Betriebssystemen , RAM und CPUs als Kommentar.

    Treiber sind auf beiden Systemen auf den neusten Stand.

    Woran kann es liegen, das der Quad-Core so lahm damit ist?

    C
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    ;-- TIME_STAMP   2018-12-19 21:51:47
    
    #Region    ;************ Includes ************
    #Include <WinAPIProc.au3>
    #Include <WindowsConstants.au3>
    #Include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <Date.au3>
    #include <WinAPIMem.au3>
    #EndRegion ;************ Includes ************
    
    Global $g_hTimer, $g_sTime, $g_iHours, $g_iMins, $g_iSecs, $g_iMiliSecs, $g_iMicroSecs, $g_dTicks
    
    _GUICtrlListView_AddArray_Demo()
    
    Func _GUICtrlListView_AddArray_Demo()
        Local $sTotalTime = _NowCalc()
        _WinAPI_SetPriorityClass($HIGH_PRIORITY_CLASS)
        #Region - GUI Create
        Local $hGUI = GUICreate('GUICtrlCreateListView', 400, 300, 400, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $WS_EX_WINDOWEDGE)
        Local $idLV = GUICtrlCreateListView('Name|Status1|Status2|Status3|Status4|Status5|Status6|Status7|Status8|Status9|Status10|Status11|Status12|Status13|Status14|Status15|Status16|Status17|Status18|Status19|Status20|Status21|Status22|Status23|Status24|Status25|Status26|Status27|Status28|Status29|Status30|Status31', 2, 2, 396, 296)
    ;~     GUISetState(@SW_MAXIMIZE)
        GUISetState()
        #EndRegion - GUI Create
    
    ;~     Local $sStartTime = _NowCalc()
        Local $aLV[1600][32], $sAdd
        For $i = 0 To UBound($aLV) - 1 Step 1
            $aLV[$i][0] = 'Name' & $i + 1
            For $j = 1 To UBound($aLV, 2) - 1 Step 1
                $aLV[$i][$j] = 'Status' & $j
            Next
        Next
    
        Local $iWidth = 109
        Local $aWJLV = [[$iWidth, 0], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2], [$iWidth, 2]]
        For $i = 0 To UBound($aWJLV) - 1 Step 1
            _GUICtrlListView_SetColumnWidth($idLV, $i, $aWJLV[$i][0])
            _GUICtrlListView_JustifyColumn($idLV, $i, $aWJLV[$i][1]) ; 0 left, 1 right, 2 center
        Next
    
        ConsoleWrite('! Benoetigte Zeit, um das Listview mit _GUICtrlListView_AddArray zu befuellen ($aLV[1600][32]): ')
        $g_hTimer = TimerInit()
        _GUICtrlListView_AddArray($idLV, $aLV)
        _GetTime($g_hTimer)
        ConsoleWrite($g_sTime & @CRLF)
    
        _GetGlobalMemoryStatus()
        _GetCPUInfo()
    
        #Region - GUI SwitchLoop
        While True
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
        #EndRegion - GUI SwitchLoop
    EndFunc   ;==>_GUICtrlListView_AddArray_Demo
    
    Func _GetTime($hTimer = $g_hTimer)
        $g_dTicks = TimerDiff($hTimer)
        $g_iMicroSecs = StringRegExpReplace($g_dTicks, '.+\.(.+)', '\1')
        $g_iMiliSecs = Int(Mod($g_dTicks, 1000))
        _TicksToTime(Int($g_dTicks), $g_iHours, $g_iMins, $g_iSecs)
        $g_sTime = StringFormat("%02i:%02i:%02i:%03i:%05i", $g_iHours, $g_iMins, $g_iSecs, $g_iMiliSecs, $g_iMicroSecs)
    EndFunc  ;==>_GetTime
    
    Func _GetGlobalMemoryStatus()
        Local $aMem = _WinAPI_GlobalMemoryStatus()
        _ArrayColInsert($aMem, 0)
        $aMem[0][0] = 'Percent of Mem in use : '
        $aMem[1][0] = 'Physical Mem: Total   : '
        $aMem[2][0] = 'Physical Mem: Free    : '
        $aMem[3][0] = 'Paging file: Total    : '
        $aMem[4][0] = 'Paging file: Free     : '
        $aMem[5][0] = 'User Mem: Total       : '
        $aMem[6][0] = 'User Mem: Free        : '
        ConsoleWrite(@CRLF & '! MemoryStatus' & @CRLF & _ArrayToString($aMem, '') & @CRLF)
    
    EndFunc
    
    Func _GetCPUInfo()
        Local $iPID = Run('wmic cpu get /Format:List', '', @SW_HIDE, $STDOUT_CHILD)
        If $iPID Then
            ProcessWaitClose($iPID)
            Local $sOutput = StringRegExpReplace(StdoutRead($iPID), '(\R)+', @CRLF)
            ConsoleWrite(@CRLF & '>wmic cpu get /Format:List' & @CRLF & @CRLF & $sOutput & @CRLF)
        EndIf
    EndFunc
    
    #cs
    WIN_10 X64                                                WIN_7 X64
    
    Benötigte Zeit _GUICtrlListView_AddArray ($aLV[1600][32])
    00:00:07:341:03117                                        00:00:00:930:2147483647
    
    MemoryStatus
    Percent of Mem in use : 60                                Percent of Mem in use : 36
    Physical Mem: Total   : 6432137216                        Physical Mem: Total   : 8454860800
    Physical Mem: Free    : 2527944704                        Physical Mem: Free    : 5352329216
    Paging file: Total    : 7841423360                        Paging file: Total    : 16907776000
    Paging file: Free     : 1641803776                        Paging file: Free     : 13577187328
    User Mem: Total       : 4294836224                        User Mem: Total       : 4294836224
    User Mem: Free        : 4103241728                        User Mem: Free        : 4164423680
    
    
    CPU-Info
    >wmic cpu get /Format:List
    
    
    AddressWidth=64                                            AddressWidth=64
    Architecture=9                                          Architecture=9
    AssetTag=To Be Filled By O.E.M.                         Availability=3
    Availability=3                                          Caption=AMD64 Family 16 Model 6 Stepping 3
    Caption=Intel64 Family 6 Model 26 Stepping 5            ConfigManagerErrorCode=
    Characteristics=                                        ConfigManagerUserConfig=
    ConfigManagerErrorCode=                                 CpuStatus=1
    ConfigManagerUserConfig=                                CreationClassName=Win32_Processor
    CpuStatus=1                                             CurrentClockSpeed=2200
    CreationClassName=Win32_Processor                       CurrentVoltage=11
    CurrentClockSpeed=2668                                  DataWidth=64
    CurrentVoltage=                                         Description=AMD64 Family 16 Model 6 Stepping 3
    DataWidth=64                                            DeviceID=CPU0
    Description=Intel64 Family 6 Model 26 Stepping 5        ErrorCleared=
    DeviceID=CPU0                                           ErrorDescription=
    ErrorCleared=                                           ExtClock=200
    ErrorDescription=                                       Family=1
    ExtClock=133                                            InstallDate=
    Family=198                                              L2CacheSize=2048
    InstallDate=                                            L2CacheSpeed=
    L2CacheSize=1024                                        L3CacheSize=0
    L2CacheSpeed=                                           L3CacheSpeed=0
    L3CacheSize=8192                                        LastErrorCode=
    L3CacheSpeed=0                                          Level=16
    LastErrorCode=                                          LoadPercentage=4
    Level=6                                                 Manufacturer=AuthenticAMD
    LoadPercentage=24                                       MaxClockSpeed=2200
    Manufacturer=GenuineIntel                               Name=AMD Turion(tm) II Neo N54L Dual-Core Processor
    MaxClockSpeed=2668                                      NumberOfCores=2
    Name=Intel(R) Core(TM) i7 CPU         920  @ 2.67GHz    NumberOfLogicalProcessors=2
    NumberOfCores=4                                         OtherFamilyDescription=
    NumberOfEnabledCore=4                                   PNPDeviceID=
    NumberOfLogicalProcessors=8                             PowerManagementCapabilities=
    OtherFamilyDescription=                                 PowerManagementSupported=FALSE
    PartNumber=To Be Filled By O.E.M.                       ProcessorId=178BFBFF00100F63
    PNPDeviceID=                                            ProcessorType=3
    PowerManagementCapabilities=                            Revision=1539
    PowerManagementSupported=FALSE                          Role=CPU
    ProcessorId=BFEBFBFF000106A5                            SocketDesignation=CPU 1
    ProcessorType=3                                         Status=OK
    Revision=6661                                           StatusInfo=3
    Role=CPU                                                Stepping=3
    SecondLevelAddressTranslationExtensions=TRUE            SystemCreationClassName=Win32_ComputerSystem
    SerialNumber=To Be Filled By O.E.M.                     SystemName=SERVER
    SocketDesignation=CPU 1                                 UniqueId=
    Status=OK                                               UpgradeMethod=1
    StatusInfo=3                                            Version=Modell 6, Stepping 3
    Stepping=                                               VoltageCaps=
    SystemCreationClassName=Win32_ComputerSystem
    SystemName=ILLUMINATI
    ThreadCount=8
    UniqueId=
    UpgradeMethod=1
    Version=
    VirtualizationFirmwareEnabled=TRUE
    VMMonitorModeExtensions=TRUE
    VoltageCaps=0
    #ce
    Alles anzeigen
  • Internetseite auslesen und dann?

    • Bitnugger
    • 19. Dezember 2018 um 20:42
    Zitat von Musashi

    Das sehe ich, insbesondere bei weniger fortgeschrittenen Usern, etwas anders

    Ja, ich auch... für Anfänger quasi ein Muss, für Fortgeschrittene eine gute Empfehlung, für Profis optional, da die ja keine Fehler mehr machen. 8o

    Zitat von Code4Fun

    Wie geht man denn bei sowas weiter vor?

    In dem Bild sind ja einige der Fehlermeldungen zu sehen... z.B.: warning: $sType already declared/assigned

    Das bedeutet, dass du mehrfach versucht hast, eine Variable zu deklarieren oder ihr einen Wert zuzuweisen - ist übrigens ein sehr häufig anzutreffender Fehler.

    Beispiel:

    Code
    Local $sType = 'COM'
    ; ...
    Local $sType = 'BAT' ; diese Zeile löst dann die Fehlermeldung aus, weil das Local davor steht.

    Häufig passiert das auch mit Konstanten, die in Includes deklariert sind... und/oder nachdem du AutoIt auf die neuste Version aktualisiert hast...

    Code
    #Include <AutoItConstants.au3>
    
    Global Const $WIN_STATE_MINIMIZED = 16 ; MustDeclareVars schmeißt hier einen Fehler bei AutoIt Version >= 3.3.14.3, weil diese Konstante bereits in dem Include AutoItConstants.au3 deklariert wurde, bei älteren Version aber nicht, weil sie da noch in dem Include fehlen.
    
    Local $iState = WinGetState($hWnd)
    If BitAND($iState, $WIN_STATE_MINIMIZED) Then ConsoleWrite('Fenster ' & $hWnd & 'ist minimiert!' & @CRLF)
  • _TimerKillTimer crasht beim beenden (nur im 64-Bit-Modus)

    • Bitnugger
    • 19. Dezember 2018 um 13:17
    Zitat von xSunLighTx3

    Mhh beide Methoden führen nicht zum Erfolg.

    Hast du auch mit Sleep() und GuiDelete() getestet? Erhöhe auch mal die Zeit für Sleep()... auf 1000 z.B.

  • _TimerKillTimer crasht beim beenden (nur im 64-Bit-Modus)

    • Bitnugger
    • 19. Dezember 2018 um 13:04

    Versuche doch mal, ob es funktioniert, wenn du vor dem Exit ein Sleep() einbaust, dass größer ist als $iElapse und/oder vor dem Exit ein GuiDelete($hMainGui) machst.

    Code
    Func _CloseMainGui()
        _Timer_KillAllTimers($hMainGui)
    ;~  _Timer_KillTimer($hMainGui, $idTimer)
        Sleep(250 + 50)
    ;~  GuiDelete($hMainGui)
        Exit
    EndFunc
  • _TimerKillTimer crasht beim beenden (nur im 64-Bit-Modus)

    • Bitnugger
    • 19. Dezember 2018 um 12:51
    Zitat von xSunLighTx3

    Also irgendwas scheint da zu langsam zu sein, vielleicht wird das Gui vor _Timer_KillAllTimers() gelöscht, sodass die Funktion auf einen NULL Pointer zugreift und dannabstürzt.

    Nein, die Timer-Funktionen prüfen das übergebene Window-Handle mit IsHWnd($hWnd) auf Gültigkeit und falls es nicht gültig ist, wird die Funktion sofort verlassen und liefert den Rückgabewert False - dann ist $hWnd aber kein Null Pointer (0x00000000 oder 0x0000000000000000), sondern ein ungültiges Window-Handle (z.B. 0x000404E8 oder 0x00000000000404E8), doch dadurch sollte AutoIt aber keinesfalls abstürzen.

    Auch ein Null Pointer kann ein gültiger Pointer sein... denn so funktioniert es z.B. auch:

    Code
    #AutoIt3Wrapper_UseX64=y ; 64Bit-Modus
    
    Global $pNullPointer = HWnd(0) ; oder Ptr(0)
    ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $pNullPointer --> " & $pNullPointer & @CRLF)
    
    Global $idTimer = _Timer_SetTimer($pNullPointer, 250, '_TimerFunc')
    ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $idTimer --> " & $idTimer & @CRLF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @CRLF)
    
    Sleep(1000)
    
    Global $bKillAllTimers = _Timer_KillAllTimers($pNullPointer)
    ConsoleWrite('$bKillAllTimers = ' & $bKillAllTimers & @CRLF)
    
    Func _TimerFunc($hWnd, $iMsg, $iIDTimer, $iTime)
        ConsoleWrite('_TimerFunc: $hWnd = ' & $hWnd & '  $iMsg = ' & $iMsg & '  $iIDTimer = ' & $iIDTimer & '  $iTime = ' & $iTime & @CRLF)
    EndFunc
    Alles anzeigen
  • Windows Display driver/manager??

    • Bitnugger
    • 19. Dezember 2018 um 00:35

    Hier noch mal das Script aus Post #14, ein wenig erweitert und mit zusätzlichen Infos:

    C
    ;-- TIME_STAMP   2018-12-19 00:23:30   v 0.1
    
    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
    
    #Region ;************ Includes ************
    #include <ProcessConstants.au3>
    #include <Array.au3>
    #include <WinAPI.au3> ; Windows XP to Windows 8.1
    ;~ #include <WinAPIProc.au3> ; Windows 10
    #EndRegion ;************ Includes ************
    
    ConsoleWrite('> @AutoItVersion = ' & @AutoItVersion & '   @AutoItPID = ' & @AutoItPID & @CRLF & @CRLF)
    
    Global Const $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20
    
    ;~ ConsoleWrite('CurrentThread = ' & _WinAPI_GetCurrentThread() & @CRLF)
    
    Global $aLogicalProcessors[0], $g_aDefaultAffinityMasks, $g_iNumberOfCores, $g_iNumberOfEnabledCore, $g_iNumberOfProcessors, $g_iNumberOfLogicalProcessors ; EnvGet('NUMBER_OF_PROCESSORS')
    
    _Example()
    
    Func _Example()
        Local $aProcessors = _GetProcessors()
        $g_iNumberOfProcessors        = $aProcessors[0]
        $g_iNumberOfLogicalProcessors = $aProcessors[1]
        $g_iNumberOfCores             = $aProcessors[2]
        $g_iNumberOfEnabledCore       = $aProcessors[3]
        ConsoleWrite('> $g_iNumberOfProcessors        = ' & $g_iNumberOfProcessors & @CRLF)
        ConsoleWrite('> $g_iNumberOfLogicalProcessors = ' & $g_iNumberOfLogicalProcessors & @CRLF)
        ConsoleWrite('> $g_iNumberOfCores             = ' & $g_iNumberOfCores & @CRLF)
        ConsoleWrite('> $g_iNumberOfEnabledCore       = ' & $g_iNumberOfEnabledCore & @CRLF & @CRLF)
    
        If $g_iNumberOfLogicalProcessors Then
                ReDim $aLogicalProcessors[$g_iNumberOfLogicalProcessors]
            For $i = 0 To $g_iNumberOfLogicalProcessors -1 Step 1
                $aLogicalProcessors[$i] = '0x' & Hex(Int(2^$i), 8) ; Hex(2^$i, 8) geht nicht, weil Hex(2^0) fälschlicherweise 0x3FF0000000000000 ist, und nicht 0x0000000000000001!
                ConsoleWrite(StringFormat('$aLogicalProcessors[%2i] = %8s  BitMask --> %s\r\n', $i, $aLogicalProcessors[$i], _UsedLogicalProcessorsToBinaryString($g_iNumberOfLogicalProcessors, $aLogicalProcessors[$i])))
            Next
            ConsoleWrite(@CRLF)
        EndIf
    ;~     _ArrayDisplay($aLogicalProcessors, '$aLogicalProcessors')
    ;~     Exit
    
        $g_aDefaultAffinityMasks = _GetProcessAffinityMasks(@AutoItPID)
    
        If UBound($aLogicalProcessors) >= 2 Then
            _SetProcessAffinityMask(@AutoItPID, $aLogicalProcessors[0])
            _SetProcessAffinityMask(@AutoItPID, $aLogicalProcessors[1])
        EndIf
        If UBound($aLogicalProcessors) >=  4 Then _SetProcessAffinityMask(@AutoItPID, $aLogicalProcessors[3])
        If UBound($aLogicalProcessors) >=  6 Then _SetProcessAffinityMask(@AutoItPID, BitOR($aLogicalProcessors[4], $aLogicalProcessors[5]))
        If UBound($aLogicalProcessors) >=  8 Then _SetProcessAffinityMask(@AutoItPID, BitOR($aLogicalProcessors[4], $aLogicalProcessors[7]))
        If UBound($aLogicalProcessors) >= 16 Then _SetProcessAffinityMask(@AutoItPID, BitOR($aLogicalProcessors[11], $aLogicalProcessors[12], $aLogicalProcessors[15]))
        If UBound($aLogicalProcessors) >= 32 Then _SetProcessAffinityMask(@AutoItPID, BitOR($aLogicalProcessors[11], $aLogicalProcessors[12], $aLogicalProcessors[31]))
    
        ; Restore ProcessAffinityMask to default
        If $g_aDefaultAffinityMasks[0] Then _SetProcessAffinityMask(@AutoItPID, $g_aDefaultAffinityMasks[1])
    EndFunc
    
    Func _GetProcessAffinityMasks($iPID)
        Local $hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, $iPID, True) ; Returns a handle of an existing process object
        Local $aAffinityMask = _WinAPI_GetProcessAffinityMask($hProcess)
        ConsoleWrite('- Default AffinityMask' & @CRLF)
        _PrintProcessInfo($hProcess)
        _WinAPI_CloseHandle($hProcess) ; Closes an open object handle
        Return $aAffinityMask
    EndFunc   ;==>_GetProcessAffinityMasks
    
    Func _SetProcessAffinityMask($iPID, $iMask)
        If $iMask < 1 Or $iMask > 2 ^ $g_iNumberOfLogicalProcessors - 1 Then
            ConsoleWrite('! $iMask (' & $iMask & ') ist zu ' & ($iMask < 1 ? 'klein' : 'gross') & '! (1 to ' & 2 ^ $g_iNumberOfLogicalProcessors - 1 & ' for ' & $g_iNumberOfLogicalProcessors & ' Logical Processors)' & @CRLF & @CRLF)
            Return False
        EndIf
    
        Local $hProcess, $iSetMask = 0
        $hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, $iPID, True) ; Returns a handle of an existing process object
        If IsPtr($hProcess) Then
            $iSetMask = _WinAPI_SetProcessAffinityMask($hProcess, $iMask) ; Sets a processor affinity mask for the threads of a specified process
            ConsoleWrite('- New AffinityMask ($iMask = 0x' & Hex($iMask, 8) & ')' & @CRLF)
            _PrintProcessInfo($hProcess)
            _WinAPI_CloseHandle($hProcess) ; Closes an open object handle
        EndIf
        Return $iSetMask
    EndFunc   ;==>_SetProcessAffinityMask
    
    Func _PrintProcessInfo($hProcess)
        Local $aAffinityMask = _WinAPI_GetProcessAffinityMask($hProcess) ; Obtains the affinity masks for the process and the system
        If UBound($aAffinityMask) Then
            ConsoleWrite('> $aAffinityMask[0]    = ' & $aAffinityMask[0] & @TAB & @TAB & 'True on success, otherwise False' & @CRLF)
            ConsoleWrite('> $aAffinityMask[1]    = 0x' & Hex($aAffinityMask[1], 8) & @TAB & 'Process affinity mask' & @TAB & @TAB & 'BitMask --> ' & _UsedLogicalProcessorsToBinaryString($g_iNumberOfLogicalProcessors, $aAffinityMask[1]) & @CRLF)
            ConsoleWrite('> $aAffinityMask[2]    = 0x' & Hex($aAffinityMask[2], 8) & @TAB & 'System affinity mask'  & @TAB & @TAB & 'BitMask --> ' & _UsedLogicalProcessorsToBinaryString($g_iNumberOfLogicalProcessors, $aAffinityMask[2]) & @CRLF)
            Local $iUsedProcessorNumber = DllCall('Kernel32.dll', 'dword', 'GetCurrentProcessorNumber')[0]
            ConsoleWrite('+ Used ProcessorNumber = ' & $iUsedProcessorNumber & @TAB & @TAB & '$aLogicalProcessors['&$iUsedProcessorNumber&'] --> ' & $aLogicalProcessors[$iUsedProcessorNumber] & @CRLF & @CRLF)
        EndIf
    EndFunc   ;==>_PrintProcessInfo
    
    ;~ >wmic CPU GET /FORMAT:List|find "NumberOf"
    ;~ NumberOfCores=2
    ;~ NumberOfLogicalProcessors=2
    ;
    ;~ >wmic COMPUTERSYSTEM GET /FORMAT:List|find "NumberOf"
    ;~ NumberOfLogicalProcessors=2
    ;~ NumberOfProcessors=1
    Func _GetProcessors()
        Local $aWMI[4], $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\"), $oColItems, $aClasses = ['Win32_ComputerSystem', 'Win32_Processor']
    
        For $i = 0 To UBound($aClasses) -1 Step 1
            $oColItems = $objWMIService.ExecQuery("SELECT * FROM " & $aClasses[$i], "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
            If IsObj($oColItems) then
                For $objItem In $oColItems
                    Switch $aClasses[$i]
                        Case 'Win32_ComputerSystem'
                                $aWMI[0] = $objItem.NumberOfProcessors
                        Case 'Win32_Processor'
                                $aWMI[1] = $objItem.NumberOfLogicalProcessors
                                $aWMI[2] = $objItem.NumberOfCores
                                $aWMI[3] = @OSVersion = 'WIN_10' ? $objItem.NumberOfEnabledCore : -1
                    EndSwitch
                Next
            Else
                Msgbox(16, "_GetProcessors", "No WMI Objects found for Class: " & $aClasses[$i])
            Endif
        Next
        Return $aWMI
    EndFunc   ;==>_GetProcessors
    
    Func _UsedLogicalProcessorsToBinaryString($iNumberOfLogicalProcessors, $iUsedLogicalProcessors)
        Local $bAffinityMask
        For $i = $iNumberOfLogicalProcessors -1 To 0 Step -1
            $bAffinityMask &= BitAND($iUsedLogicalProcessors, 2^$i) ? '1' : '0'
        Next
        Return SetExtended(Int($bAffinityMask), $bAffinityMask)
    EndFunc
    Alles anzeigen
  • Windows Display driver/manager??

    • Bitnugger
    • 18. Dezember 2018 um 22:17
    Zitat von Ovik

    So, hatte nun endlich Zeit, den Code von Bitnugger einmal durchzutesten und bin auf das einfache Problem gestossen, dass ich logische Prozessoren >32 nicht setzen kann.

    Dann hat jeder deiner 18 Cores halt nur zwei logische Prozessoren... das ist aber kein Problem, sondern Fakt!

    Zitat von Ovik

    Ich habe mit dem 18 Core und Hyperthreading 36 ausgewiesene logische Prozessoren.

    Was hat Hyperthreading damit zu tun?

    Zitat von Ovik

    Weiss jemand, wie ich die Maske setzen muss, um die anderen Prozessoren zu setzen?

    Die Funktion _GetProcessors() liefert dir doch u.A. die Anzahl der vorhandenen/verfügbaren logischen Prozessoren... und natürlich kannst du nur diese der Mask hinzufügen.

    Zitat von Ovik

    die bit-weisen operationen sind haben sich mir noch nicht erschlossen...

    Code
    In der Mask wird für jeden Prozessor ein Bit an entsprechender Stelle gesetzt... wenn du 32 logische Prozessoren hast, brauchst du ergo auch 32 Bits.
    
    Hier die Bits... ganz rechts ist Bit 0 (2^0), ganz links ist Bit 31 (2^31)... (von 0 bis 31 sind 32)
                               76543210
    10000000 00000000 00000000 10000001
    ^                          ^      ^ ... $iLogicalProcessor01 (Bit 0 = 2^0 = Dec 1 = Hex 0x00000001)
    ^                          ^ ... $iLogicalProcessor08 (Bit 7 = 2^7 = Dec 128 = Hex 0x00000080)
    ^ ... $iLogicalProcessor32 (Bit 31 = 2^31 = Dec 2147483648 = Hex 0x80000000)
    
    Will ich nun diese drei Prozessoren benutzen, muss ich sie in die Mask eintragen...
    $iMask = BitOr(2^0, 2^7, 2^31)                     ; --> 0x80000081
    $iMask = BitOr(1, 128, 2147483648)                 ; --> 0x80000081
    $iMask = BitOr(0x00000001, 0x00000080, 0x80000000) ; --> 0x80000081
    
    In unserem Fall könnten die Werte auch einfach addiert werden.
    $iMask = 2^0 + 2^7 + 2^31                          ; --> 0x80000081
    $iMask = 1 + 128 + 2147483648                      ; --> 0x80000081
    $iMask = 0x00000001 + 0x00000080 + 0x80000000      ; --> 0x80000081
    
    Das funktioniert aber nur, wenn durch die zu addierenden Werte ein Bit nur einmalig auf 1 gesetzt wird, andernfalls führt es zu anderen/falschen Ergebnissen.
    Hier ein Beispiel:
    $iMask = BitOR(1, 2, 4)  ; --> 0x00000007 <-- 1 = Bit 0, 2 = Bit 1, 4 = Bit 2
    $iMask = 1 + 2 + 4       ; --> 0x00000007 <-- OK!
    $iMask = BitOR(1, 2, 48) ; --> 0x00000033 <-- 1 = Bit 0, 2 = Bit 1, 48 = Bit 4 (16) und Bit 5 (32)
    $iMask = 1 + 2 + 48      ; --> 0x00000033 <-- OK!
    $iMask = BitOR(1, 2, 3)  ; --> 0x00000003 <-- 1 = Bit 0, 2 = Bit 1, 3 = Bit 0 und Bit 1
    $iMask = 1 + 2 + 3       ; --> 0x00000006 <-- Fehler!
    Alles anzeigen
  • Variablen Wert in Schleife vergleichen

    • Bitnugger
    • 18. Dezember 2018 um 21:50
    Zitat von xSunLighTx3

    So könnte man die Do Schleife anwenden. Ist hier auch am besten für geeignet.

    Ich würde hier While...WEnd bevorzugen, denn dann wird Sleep(250) nur ausgeführt, solange sich der Wert noch nicht geändert hat.

    Code
    Local $vRegRead = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\XYZ\\XYZ Info", "ID ")
    
    While $vRegRead = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\XYZ\\XYZ Info", "ID ")
        Sleep(250)
    WEnd
  • _TimerKillTimer crasht beim beenden (nur im 64-Bit-Modus)

    • Bitnugger
    • 18. Dezember 2018 um 21:32

    Bei mir stürzt es nicht ab...

    @OSVersion = WIN_10|WIN_7/Service Pack 1

    @OSArch = X64

    @AutoItVersion = 3.3.14.5

    @AutoItX64 = 0|1

    SciTE = v.3.7.5.0

    Die Funktion _Timer_KillAllTimers ist bei @AutoItVersion 3.3.14.2|3.3.14.5 identisch...

  • Zu : Funktion _Number() von BugFix

    • Bitnugger
    • 17. Dezember 2018 um 23:10

    Falls es eine Rolle spielt: Number() gibt das Ergebnis immer als Double zurück, wenn in expression ein Punkt enthalten ist.

    Code
    Number(0<2)  -->  1 Int32
    Number(2>0)  -->  1 Int32
    Number(2^0)  -->  1 Double
    Number(2.0)  -->  2 Double
    Number(20)   --> 20 Int32
    Number(20/4) -->  5 Double
    Number(20*4) --> 80 Int32
    Number(20-4) --> 16 Int32
    Number(20+4) --> 24 Int32
  • Zu : Funktion _Number() von BugFix

    • Bitnugger
    • 17. Dezember 2018 um 21:12

    BugFix

    Mir ist gerade aufgefallen... wenn -123 und - 123 Numbers sind, dann sollten +123 und + 123 es auch sein...

  • Zu : Funktion _Number() von BugFix

    • Bitnugger
    • 15. Dezember 2018 um 16:28
    Zitat von Musashi

    Bei Übergabe von Werten mit Vorzeichen, wird auch ein Leerzeichen zwischen Vorzeichen und Digit akzeptiert (sowohl: -1.25 als auch - 1.25).

    Wenn $_Expression ein String ist, liefert Number() und auch deine Funktion _Number() im zweiten Fall (mit Leerzeichen) allerdings 0 als Ergebnis...

    So würde es funktionieren...

    Code
    Func _Number($_Expression, $_iErrReturn=0xDEADBEEF, $_Flag=0)
    ;~     If VarGetType($_Expression) = 'String' Then $_Expression = StringStripWS($_Expression, 8)
        $_Expression = StringStripWS($_Expression, 8)
        If $_iErrReturn = Default Or $_iErrReturn = '' Then $_iErrReturn = 0xDEADBEEF
        If StringRegExp($_Expression, '^(\d|-\d)') Then
            Return Number($_Expression, $_Flag)
        Else
            Return SetError(1, 0, $_iErrReturn)
        EndIf
    EndFunc   ;==>_Number
  • Drag & Drop aus 7z heraus

    • Bitnugger
    • 14. Dezember 2018 um 18:07
    Zitat von Gofel

    Danke für deine Hilfe, aber es verhält sich genau gleich. Die Datei ist weg bevor ich sie einlesen kann. Oder mach ich was falsch?

    Nein, du machst nichts falsch... ich habe es gerade noch mal ausführlich bei mir getestet und bei mir funktioniert es auch nur ab und zu.

    Der 7z Dateimanager löscht die Files also tatsächlich sofort, nachdem die Drag-Message versendet wurde, und somit sind die Files teilweise schon gelöscht, bevor die Drag-Message in deinem Script ankommt... tzzz... das ist aber echt ka***!

    Mit WinRAR funktioniert es aber immer... mit deinem Beispiel-Script geht es nur mit 7zFM.exe und WinRAR.exe... mit dem Beispiel zu der Function _WinAPI_DragFinish geht es aber z.B. auch mit Total-Commander!

    Hier nochmal dein Beispiel-Script... etwas geändert... funktioniert aber auch nicht mit Total-Commander.

    C
    ;-- TIME_STAMP   2018-12-14 18:03:19   v 0.1
    
    #Region    ;************ Includes ************
    #include-once
    #include <WinAPI.au3>       ; <= AutoIt-Version 3.3.14.2
    #include <WinAPISysWin.au3> ; >= AutoIt-Version 3.3.14.3
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #EndRegion ;************ Includes ************
    
    Opt("GUIOnEventMode", 1)
    
    Global $idInput, $idEdit
    
    GUICreate("Test GUI", 800, 240, -1, -1, -1, $WS_EX_ACCEPTFILES)
    ;~ GUISetOnEvent($GUI_EVENT_DROPPED, "_On_Drop")
    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
    
    $idInput = GUICtrlCreateInput('', 10, 20, 780, 20)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    
    $idEdit = GUICtrlCreateEdit('', 10, 50, 780, 180)
    GUICtrlSetFont(-1, 10, 400, 0, 'Courier New')
    
    GUISetState(@SW_SHOW)
    
    GUIRegisterMsg($WM_DROPFILES, '_WM_DROPFILES')
    
    Do
        Sleep(10)
    Until 0
    
    Func _WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam)
        Switch $iMsg
            Case $WM_DROPFILES
                Local $aFileList = _WinAPI_DragQueryFileEx($wParam)
                If Not @error Then
                    GUICtrlSetData($idEdit, '--------------------------------------------------' & @CRLF, 1)
                    For $i = 1 To $aFileList[0]
                        GUICtrlSetData($idEdit, StringFormat('FileExists = %i  DragFile_%03i = %s\r\n', FileExists($aFileList[$i]), $i, $aFileList[$i]), 1)
                    Next
                EndIf
                _WinAPI_DragFinish($wParam)
                Return 0
        EndSwitch
        Return $GUI_RUNDEFMSG ; Anweisung an Windows, dass es mit der normalen Abarbeitung fortfahren kann
    EndFunc
    
    ;~ Func _On_Drop()
    ;~     $ret = FileCopy(@GUI_DragFile, @DesktopDir & "\test.txt")
    ;~     MsgBox(0,"",$ret)
    ;~     Local $aFiles = StringSplit(GUICtrlRead($idInput) & '|', '|', 2)
    ;~     _ArrayDelete($aFiles, UBound($aFiles) -1)
    ;~     If UBound($aFiles) Then
    ;~         GUICtrlSetData($idEdit, '@GUI_DragFile = ' & @GUI_DragFile & @CRLF, 1)
    ;~         For $i = 0 To UBound($aFiles) -1 Step 1
    ;~             GUICtrlSetData($idEdit, StringFormat('DragFile_%03i     = %s\r\n', $i, $aFiles[$i]), 1)
    ;~         Next
    ;~     EndIf
    ;~ EndFunc   ;==>_On_Drop
    
    Func _Exit()
        Exit 1
    EndFunc   ;==>_Exit
    Alles anzeigen
  • Drag & Drop aus 7z heraus

    • Bitnugger
    • 14. Dezember 2018 um 14:54

    Schau dir mal in der AutoIt-Hilfe das Beispiel zu der Function _WinAPI_DragFinish an - damit funktioniert es!

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™