Schade. Ich setze das mal auf gelöst, aber den Bug sollte man schon beheben ..... ![]()
Beiträge von veronesi
-
-
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?
-
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.
-
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. -
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)
[/autoit] [autoit][/autoit] [autoit]
HotKeySet("{ESC}")While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(5000)
WEnd
ExitFunc test()
[/autoit]
AdlibUnRegister("test")
ToolTip("Funktion")
Sleep(4000)
ToolTip("")
AdlibRegister("test", 5000)
Return 1
EndFunc ;==>testMein 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 -
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
[/autoit] [autoit][/autoit] [autoit]
;===============================================================================================================================
;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=VeronesiOpt("MustDeclareVars", 1) ;Must declare variables
[/autoit] [autoit][/autoit] [autoit]
Opt("WinWaitDelay", 100)
OnAutoItExitRegister("_Exit") ;Create defined Exit Callback Register#include-once
[/autoit] [autoit][/autoit] [autoit]
#EndRegion ;End of Header
;===============================================================================================================================#Region ;Variables, Constants
[/autoit] [autoit][/autoit] [autoit]
Dim $RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Multimedia\Sound Mapper"
Dim $ActualSettings, $OutputDevice1, $OutputDevice2, $Status
#EndRegion ;End of Variables, Constants
;===============================================================================================================================#Region ;Main
[/autoit] [autoit][/autoit] [autoit]
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$OutputDevice1 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice1","Realtek HD Audio output")
[/autoit] [autoit][/autoit] [autoit]
$OutputDevice2 = IniRead(@ScriptDir & "\Swap_AudioOutput_Settings.ini","Audio Output","OutputDevice2","Realtek HD Audio output")$ActualSettings = RegRead($RegKey, "Playback")
[/autoit] [autoit][/autoit] [autoit]If $ActualSettings = $OutputDevice1 Then
[/autoit] [autoit][/autoit] [autoit]
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_Exit()
[/autoit] [autoit][/autoit] [autoit]
#EndRegion ;End of Main
;===============================================================================================================================#Region ;Functions
[/autoit]
Func _Exit()
Exit
EndFunc ;==>_Exit
#EndRegion ;End of Functions
Gruss Veronesi -
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
-
Das wurde auf der ersten Seite dieses Posts bereits diskutiert und ist in diesem Fall keine Lösung.
-
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 -
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! -
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!
-
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 = ""
[/autoit] [autoit][/autoit] [autoit]
Dim Const $LogfilePath = @ScriptDir & "\_Logfile.log"
FileDelete($LogfilePath)AdlibRegister("_LogfileWriteTimer", 1000)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$Timer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 to 100000
_AddToLogfile($i)
Next
$End = TimerDiff($Timer)
_AddToLogfile($End)_Exit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _AddToLogfile($ReturnValueForLogfile)
[/autoit] [autoit][/autoit] [autoit]
$sLogfile &= @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " : " & $ReturnValueForLogfile & @CRLF
EndFunc ;==>_AddToLogfileFunc _LogfileWriteTimer()
[/autoit] [autoit][/autoit] [autoit]
FileWriteLine($LogfilePath, $sLogfile)
$sLogfile = ""
EndFunc ;==>_LogfileWriteTimerFunc _Exit()
[/autoit]
_LogfileWriteTimer() ;Write the last time.
Exit
EndFunc ;==>_ExitDabei 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 -
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()
[/autoit][autoit][/autoit][autoit]
For $i = 1 to 1000
_FileWriteLog(@ScriptDir & "\my.log",$i)
Next
$End = TimerDiff($Timer)
_FileWriteLog(@ScriptDir & "\my.log","Ausführdauer: " & $End)$Timer = TimerInit()
[/autoit]
$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)Erstes Logfile: 2 Sekunden
Zweites Logfile: 20 Millisekunden -

Gut gesprochen!Mit diesem Script
[autoit]#include <file.au3>
[/autoit][autoit][/autoit][autoit]$Timer = TimerInit()
[/autoit]
For $i = 1 to 1000
_FileWriteLog(@ScriptDir & "\my.log",$i)
Next
$End = TimerDiff($Timer)
_FileWriteLog(@ScriptDir & "\my.log","Ausführdauer: " & $End)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. -
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...)
-
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) -
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.
-
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. -
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.
-
Hallo Chip,
ich habe mal die "automatische" Debug to Console angeschaut.
[autoit]
Das Problem fängt schon bei einem einzeiligen Program an:Dim $AskedUsername = InputBox("Benutzernamen eingeben", "Bitte Benutzernamen eingeben", "blabla")
[/autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Dim = ' & Dim & @crlf & '>Error code: ' & @error & @crlf) ;### Debug ConsoleDie 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...