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

Beiträge von veronesi

  • Probleme mit Adlibregister in Funktion

    • veronesi
    • 5. April 2011 um 10:26

    Schade. Ich setze das mal auf gelöst, aber den Bug sollte man schon beheben ..... :)

  • Probleme mit Adlibregister in Funktion

    • veronesi
    • 5. April 2011 um 09:12

    Ja, das wäre tatsächlich eine Lösung.
    Allerdings frage ich mich wirklich, ob man nicht AdlibRegister zum laufen bringen könnte. Weil wenn ich den "DeRegistriere" sollte er beim nächsten registrieren doch "von 0" anfangen.

    Ist das ein Bug?

  • Probleme mit Adlibregister in Funktion

    • veronesi
    • 5. April 2011 um 09:07

    Hi n2b.ch
    Danke für den Tipp. Nur dann wird ja die AdlibRegister Zeit verändert.

    Also in Deinem Beispiel ist dann die Zeit plötzlich nicht mehr 5 sekunden, sondern 11s.

  • Probleme mit Adlibregister in Funktion

    • veronesi
    • 5. April 2011 um 08:59

    Hallo Eukalyptus,

    vielen Dank. Ich verwende momentan auch in etwa Deine erste Variante.
    Ich dachte bloss, dass wenn ich ein umfangreiches Main habe, welches nur alle 10 Sekunden fertig wird, dass ich mit Adlibregister besser dran bin.

    Klar, Multitasking geht ja nicht, trotzdem!
    Irgendwie denke ich, dass das mit Adlibregister doch gehen MÜSSTE.

  • Probleme mit Adlibregister in Funktion

    • veronesi
    • 5. April 2011 um 07:29

    Hallo zusammen,

    ich habe ein seltsames Phänomen mit Adlibregister, welches ich nicht wegkriege!
    Ich definiere mit AdlibRegister einen Timer, der z.B. alle 5 Sekunden eine Funktion aufruft.

    In dieser Funktion wird dieser Timer deaktiviert weil die Funktion z.B. länger als 5 Sekunden dauert, oder weil sie die Zeit wesentlich beeinflussen würde.
    Am Ende dieser Funktion wird der Timer wieder aktiviert.

    Spoiler anzeigen
    [autoit]

    AdlibRegister("test", 5000)
    HotKeySet("{ESC}")

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

    While 1
    Sleep(5000)
    WEnd
    Exit

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

    Func test()
    AdlibUnRegister("test")
    ToolTip("Funktion")
    Sleep(4000)
    ToolTip("")
    AdlibRegister("test", 5000)
    Return 1
    EndFunc ;==>test

    [/autoit]


    Mein Problem in diesem Beispiel ist nun folgendes:
    Ich erwarte, dass nach dem verschwinden des Tooltippes (also wenn die Funktion fertig ist) die Funktion erst 5 Sekunden später wieder aufgerufen wird.
    Es dauert aber bloss 1 Sekunde.

    Was ist hier falsch?
    Gruss Veronesi

  • Standard Audiogerät setzen (Win XP + Win 7)

    • veronesi
    • 4. April 2011 um 07:18

    Ich habe hier mal meine alte Lösung rausgesucht.
    Für Windows XP geht's einfacher! Dort habe ich aber einfach ein INI-File für die Settings verwendet.

    Spoiler anzeigen
    [autoit]

    #Region ;Header
    ;===============================================================================================================================
    ;Description......: Switch from one Audio Output to an other
    ;Author...........: Veronesi
    ;Date.............: 21.01.2011
    ;===============================================================================================================================
    #NoTrayIcon
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_UseUpx=y
    #AutoIt3Wrapper_icon=S:\UE_Std\TestPC\Source\Icon.ico
    #AutoIt3Wrapper_Res_Comment=Switch from one Audio Output to an other
    #AutoIt3Wrapper_Res_Description=Switch from one Audio Output to an other
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.1
    #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
    #AutoIt3Wrapper_Res_LegalCopyright=Veronesi

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

    Opt("MustDeclareVars", 1) ;Must declare variables
    Opt("WinWaitDelay", 100)
    OnAutoItExitRegister("_Exit") ;Create defined Exit Callback Register

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

    #include-once
    #EndRegion ;End of Header
    ;===============================================================================================================================

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

    #Region ;Variables, Constants
    Dim $RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Multimedia\Sound Mapper"
    Dim $ActualSettings, $OutputDevice1, $OutputDevice2, $Status
    #EndRegion ;End of Variables, Constants
    ;===============================================================================================================================

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

    #Region ;Main
    If @OSVersion = "WIN_XP" Then
    If Not FileExists(@ScriptDir & "\Swap_AudioOutput_Settings.ini") Then
    IniWrite(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice1","Realtek HD Audio output")
    IniWrite(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice2","Realtek HD Audio output")
    EndIf

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

    $OutputDevice1 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice1","Realtek HD Audio output")
    $OutputDevice2 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice2","Realtek HD Audio output")

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

    $ActualSettings = RegRead($RegKey, "Playback")

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

    If $ActualSettings = $OutputDevice1 Then
    RegWrite($RegKey, "Playback", "REG_SZ", $OutputDevice2)
    Else
    RegWrite($RegKey, "Playback", "REG_SZ", $OutputDevice1)
    EndIf
    Else
    ShellExecute("mmsys.cpl") ;Start Sound switcher control
    WinWait("Sound", "", 10000) ;Wait max. 10s for this window
    WinActivate("Sound") ;Activate window
    Send("{Down}") ;Activate first entry
    $Status = ControlCommand("Sound", "", "[CLASS:Button; INSTANCE:2]", "IsEnabled", "") ;Check status of the button "Als Standard". If = 1 then the button is NOT deactivated!
    If Not $Status Then Send("{Down}") ;If the first entry is set as default, then take the second
    ControlClick("Sound", "", "[CLASS:Button; INSTANCE:2]")
    ControlClick("Sound", "", "[CLASS:Button; INSTANCE:4]")
    EndIf

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

    _Exit()
    #EndRegion ;End of Main
    ;===============================================================================================================================

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

    #Region ;Functions
    Func _Exit()
    Exit
    EndFunc ;==>_Exit
    #EndRegion ;End of Functions

    [/autoit]


    Gruss Veronesi

  • Standard Audiogerät setzen (Win XP + Win 7)

    • veronesi
    • 4. April 2011 um 06:19

    Nein, leider keine direkte Lösung gefunden. Ich löste es über Tastendruck-Simulationen,...

    Ist aber leider Sprachabhängig!
    Wenn jemand eine direkte Lösung findet, nur her damit :)

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 20:01

    Das wurde auf der ersten Seite dieses Posts bereits diskutiert und ist in diesem Fall keine Lösung.

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 19:16

    Bis jetzt ist es noch nie vorgekommen, dass das Programm abgestürzt ist. Manchmal sind einfach gewisse Dinge nicht installiert worden. Aus dem Log konnte ich nun aber erkennen, dass das Profil des Benutzers mit Adminrechten (RunAs) nicht geladen werden konnte.

    Einmal das lokale Profil löschen, Script nochmals laufen lassen und gut war's. Manchmal hängt sich auch bei M$ ein Profil auf. (Gut bei 2'000 Profilen auf dem Server kann das schon mal ab und an vorkommen)

    Für mich stimmt das Logfile im Moment so. Aber für den schlimmsten Fehlerfall kann der User in einer bestimmten Settingsdatei einen Eintrag verändern und dann wird nach jedem Logeintrag gespeichert. Quasi der Debugmodus.

    Dann habe ich den Vorteil, dass es normalerweise schnell geht, aber im Fehlerfall kann man auf "ausführliches Loggen" umschalten.

    Damit ist der Auftraggeber vollständig zufrieden. Für ihn war es sowieso eher Nice-To-Have!

    Danke Euch allen.
    Grüße Veronesi

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 14:27

    Ja, das ist schon richtig.
    Aber ich logge ja in meinem richtigen Programm nicht 100'000 Werte pro Sekunde!

    Dies war nur ein Extremtest um die Geschwindigkeits(verluste) zu beurteilen.
    In der Realität sind es wohl zwischen 0.1 und 50 Werten, die pro Sekunde geloggt werden müssen, jenachdem, was der PC macht.

    Das ist absolut vertretbar!
    Danke!

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 13:04

    Ob die Datei trotzdem geschrieben wird, weiss ich nicht.
    Das probiere ich lieber nicht aus, da man dann nie so sicher sein kann, was passiert.

    Evtl. kommt es auch darauf an in welchem Moment das Programm abstürzt und welches Betriebssystem und welche Service-Packs etc.

    Wenn schon ein Logfile, dann möchte ich das sauber machen.
    Ich denke 100'000 Werte schreiben in 1.2 Sekunden ist ein super Wert. Das ist mir genug schnell!

    Trotzdem vielen Dank!

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 11:17

    Hallo Eukalyptus,

    Deine Idee ist gut. Ich habe zwar nicht nach dieser UDF im englischen Forum gesucht. Doch ich habe kurz was eigenes gemacht.
    Der Trick ist wirklich, dass man die Rückgabewerte immer nur in eine Variable schreibt.

    Mittels einem Adlibregister Timer wird dann z.B. alle 1 Sekunde diese Variable gschrieben und geleert.
    Für 100'000 Werte benötigt dieses Script nun nur 1.2 Sekunden!

    Spoiler anzeigen
    [autoit]

    Global $sLogfile = ""
    Dim Const $LogfilePath = @ScriptDir & "\_Logfile.log"
    FileDelete($LogfilePath)

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

    AdlibRegister("_LogfileWriteTimer", 1000)

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

    $Timer = TimerInit()
    For $i = 1 to 100000
    _AddToLogfile($i)
    Next
    $End = TimerDiff($Timer)
    _AddToLogfile($End)

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

    _Exit()

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

    Func _AddToLogfile($ReturnValueForLogfile)
    $sLogfile &= @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " : " & $ReturnValueForLogfile & @CRLF
    EndFunc ;==>_AddToLogfile

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

    Func _LogfileWriteTimer()
    FileWriteLine($LogfilePath, $sLogfile)
    $sLogfile = ""
    EndFunc ;==>_LogfileWriteTimer

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

    Func _Exit()
    _LogfileWriteTimer() ;Write the last time.
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Dabei habe ich herausgefunden, dass der Befehl

    [autoit]

    $sLogfile &= @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " : " & $ReturnValueForLogfile & @CRLF

    [/autoit]

    sehr schnell ist. Wenn man ihn allerdins in

    [autoit]

    $sLogfile = $sLogfile & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " : " & $ReturnValueForLogfile & @CRLF

    [/autoit]

    abändert, dauert das Faktor 5 bis 10 länger!

    So allerdings bin ich absolut zufrieden mit AutoIt!
    Was meint ihr zu der Geschwindigkeit?
    Grüsse Veronesi

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 10:02

    So kann man schön den Unterschied erkennen, was es ausmacht, das File immer zu schliessen!

    [autoit]

    #include <file.au3>

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

    $Timer = TimerInit()
    For $i = 1 to 1000
    _FileWriteLog(@ScriptDir & "\my.log",$i)
    Next
    $End = TimerDiff($Timer)
    _FileWriteLog(@ScriptDir & "\my.log","Ausführdauer: " & $End)

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

    $Timer = TimerInit()
    $hFile = FileOpen(@ScriptDir & "\my2.log", 9)
    For $i = 1 to 1000
    FileWriteLine($hFile,@YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " : " & $i)
    Next
    FileClose($hFile)
    $End = TimerDiff($Timer)
    FileWriteLine(@ScriptDir & "\my2.log","Ausführdauer: " & $End)

    [/autoit]

    Erstes Logfile: 2 Sekunden
    Zweites Logfile: 20 Millisekunden

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 09:56

    ;)
    Gut gesprochen!

    Mit diesem Script

    [autoit]

    #include <file.au3>

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

    $Timer = TimerInit()
    For $i = 1 to 1000
    _FileWriteLog(@ScriptDir & "\my.log",$i)
    Next
    $End = TimerDiff($Timer)
    _FileWriteLog(@ScriptDir & "\my.log","Ausführdauer: " & $End)

    [/autoit]

    dauert es ca. 2 Sekunden um die Logeinträge zu schreiben.
    Was meint Ihr? Ist da Delphi deutlich schneller?

    Aber ich vermute mal, dass es auf das hinaus läuft, was BugFix geschrieben hat.
    Ich logge das, was wirklich notwendig ist.

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 08:58

    Ok. Habe mir soeben die Wiki Seite von APP-V kurz quergelesen. Wenn man Offline ist, funktioniert das Ganze nicht - ausser die Anwendung wurde bereits vollständig auf den PC gestreamt.
    Das würde bei uns nicht funktionieren, da gewisse Auslandstellen mit einer extrem schlechten Internetverbindung ausgestattet sind.

    Zudem muss das auch auf Notebooks funktionieren, wenn die Leute zu Kundenanlagen gehen und dort ohne Netzwerk arbeiten müssen. Es muss also alles einmal komplett installiert werden.
    Für uns ist AutoIt momentan die eleganteste Lösung. Klar, unsere "richtigen" Programmierer arbeiten u.a. in Delphi. Irgendwie wäre es cool, wenn ich auch dort arbeiten könnte und die Softwareverteilung darüber machen würde.

    Doch ich traue mich nicht, in Delphi einzuarbeiten. (Weil ich kann keine Kurse oder so belegen. Und die andern können mir aus Zeitgründen auch keine Einführung geben...)

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 08:48

    Das tönt interessant. Aber ich bin kein Programmierer und mache das nicht hauptberuflich. Deshalb ist für mich immer noch AutoIt ein gutes Tool.
    Ich programmiere darin nämlich nicht nur Softwareverteilungen, sondern auch automatisierte Prüfgeräte. Und ich weiss nicht, ob das APP-V Softwarevirtualisierung könnte.... (Kenne ich nicht)

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 08:27

    Naja, zeitkritisch ist das falsche Wort.
    Es hängt keine kritische Applikation oder sowas daran.

    Die Leute möchten einfach nicht, dass das Programm noch länger hat um durchzulaufen. Jenachdem, wieviel installiert werden muss, dauert die Programmausführung zwischen 4 Sekunden und 120 Sekunden. Und manche Leute führen das Programm alle 1h aus. (Es hängen eben noch wichtige Synchronisationen an diesem Programm).

    Aber es ist nicht so wichtig ob das Programm nun 4-120 Sekunden oder 6-122 Sekunden hat. Das merkt sowieso keiner. Aber ich möchte aus Ehrgeiz die schnellste und schlankste Variante finden.

    Leider bin ich kein Programmierer, sondern mache das nur so nebenbei für die Firma. (Und die ist sehr froh darüber, denn die "richtigen" Programmierer bei uns sind extrem ausgelastet)
    Ich kann also nur Batch, Basic, RunCMD und AutoIt etwas programmieren.

    Von demher ist AutoIt goldrichtig. Auch wenn ich mir manchmal ETWAS mehr Geschwindigkeit wünschen würde.

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 07:59

    Ja, ich denke die DebugConsole ist zwar ein Interessanter Ansatz, aber für das Feld draussen eher weniger. Zumal ich ja diesen Kanal schon benötige um zwischen meinen Programmen zu kommunizieren.
    Ja, die ca. 5'000 Zeilen Code sind mit Kommentaren und so. Also die reinen Befehle, die einen Rückgabewert liefern, liegen vermutlich so bei knapp 2'000.

    Mit diesem Programm werden sehr viele unterschiedliche Dinge erledigt. Unter anderem werden diverse Tools installiert. Dort ist es einfach, das ist eine 20ig zeilige Schleife, die aus einer Datenbank die notwendigen Installationsbefehle ausliest und dann nur ausführt. Das ist schnell geloggt. Aber die hunderte von einzelnen Registryeinträge (Ja, das wollen die wirklich alles haben!) und das setzen der Hintergrundbilder, Bildschirmauflösung, Gruppenmitgliedschaften etc.... das ist alles einzeln.

    Vermutlich werde ich einfach Schritt für Schritt Logfileeinträge hinzufügen.
    Aber welches ist die schnellste Methode um eine Zeile in eine Datei zu schreiben, um möglichst keine Zeit zu verlieren?
    Ich möchte das Loggen schon am liebsten in einer Funktion erledigen. Ist am übersichtlichsten zum anpassen. Aber wie lange dauert ein Funktionsaufruf?

    FileWriteLine scheint mir bei einem ersten Test etwas "langsam" zu sein.

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 07:50

    Erschwerend kommt noch dazu, dass meine anderen Programme auch über den StdOut / In kommunizieren und Daten austauschen. Dann müsste ich auch noch ein "Protokoll" haben um zu wissen, was Logfile und was für die anderen Programme bestimmt ist.

  • Ausführliches Logfile

    • veronesi
    • 31. März 2011 um 07:44

    Hallo Chip,

    ich habe mal die "automatische" Debug to Console angeschaut.
    Das Problem fängt schon bei einem einzeiligen Program an:

    [autoit]

    Dim $AskedUsername = InputBox("Benutzernamen eingeben", "Bitte Benutzernamen eingeben", "blabla")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Dim = ' & Dim & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    Die zweite Zeile wurde durch Alt+D automatisch erzeugt. Trotzdem funktioniert sie so nicht....
    Ich möchte nicht alle Zeilen von Hand anpassen müssen. Was ist da falsch?

    Edit: OK, ohne das DIM am anfang bringt er zwar keine Fehlermeldung, aber die Abfrage kommt dann zweimal.......
    Irgendwie haut das automatisch noch nicht so hin...

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™