Diese Möglichkeit besteht auch, wenn das mit dem parallelen Abarbeiten nicht so genau genommen wird. Wenn also die 1. Funktion so lange ruhen kann, wie die 2. Funktion für die Abarbeitung der Daten braucht, dann kann man das so vereinfachen. Aber vielleicht beschreibt Davor mal genauer, was er vorhat, dann kann man besser helfen.
Beiträge von Oscar
-
-
Ich will das Passwort eingeben und auf ENTER drücken damit das Programm startet.
Dann solltest Du die GUI-Elemente mal in die richtige Reihenfolge bringen, dann klappt das auch mit $BS_DEFPUSHBUTTON.
[autoit]
[/autoit][autoit][/autoit][autoit]
#include <GUIConstants.au3>$AWS_START = GUICreate("V93130AWS Starter", 240, 187, 1181, 512, BitOR($WS_CAPTION, $WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS))
[/autoit][autoit][/autoit][autoit]
GUISetBkColor(0x0000FF)
$AWSUSR = GUICtrlCreateLabel("Username Eingeben", 15, 5, 100, 17)
$AWS_USER = GUICtrlCreateInput(@LogonDomain & "\" & @UserName, 15, 29, 200, 21)
$AWSP = GUICtrlCreateLabel("Passwort Eingeben", 17, 64, 95, 17)
$AWS_PW = GUICtrlCreateInput("", 15, 89, 200, 21, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL))
$Start = GUICtrlCreateButton("Start", 65, 125, 101, 26, $BS_DEFPUSHBUTTON)
GUICtrlSetState($AWS_PW, $GUI_FOCUS)
GUISetState()While 1
[/autoit]
$msg = GUIGetMsg()
Select
Case $msg = $Start
MsgBox(0, 'Testing', 'Button was pressed')
exit
EndSelect
Wend -
Zum debuggen kann man auch eine MsgBox() zweckentfremden.
-
-
Was ich mit 'Spaghetti-Code' meine:
1. Du springst wahllos von einer Function in die nächste, ohne das die vorherige jemals beendet würde.
2. Der Programmcode von If...Then, For...Next, While...WEnd, Func...EndFunc, usw. ist nicht eingerückt.
3. Die GUI-Elemente werden ebenfalls erst erstellt, kurz bevor Du sie benutzt.
4. In jeder Function gibt es eine MessageLoop-Schleife.
5. Die #include-Anweisungen sind fehlerhaft (liegt hier am Forum. Musst beim einfügen von AutoIt-Programmcode in den Quellcode-Modus wechseln)
6. Einige Programmteile werden nie ausgeführt, weil das Script dort nie hinkommt.
usw...Gerade Punkt 1 ist dabei das 'Todesurteil', weil eine Function nicht als GOTO missbraucht werden soll.
Funktionen sind Unterprogramm-Aufrufe. Bei jedem Funktionsaufruf wird die Rücksprungadresse intern abgespeichert. Wird in dem Script irgendwann EndFunc oder Return erreicht, so holt sich der Interpreter diese Rücksprungadresse und kehrt ins Hauptprogramm zurück. Wird aber EndFunc bzw. Return niemals erreicht, weil man (wie Du das machst) ständig von einer Funktion in die nächste springt, so läuft irgendwann der interne Speicher über und Du erhälst eine Fehlermeldung (das Script beendet sich).
Das heißt: Dein gesamtes Script wird, wenn überhaupt, nur sehr unzuverlässig laufen.
Lerne erstmal strukturiert zu programmieren. Überlege Dir genau, was soll in der und der Funktion ausgeführt werden, rufe die einzelnen Funktionen vom Hauptprogramm aus auf und (vor allem) kehre dorthin wieder zurück.
Es ist außerdem ein guter Stil, alle GUI-Fenster am Anfang des Scripts zu erstellen und diese erst bei Bedarf mit GUISetState(@SW_SHOW, $GUI) sichtbar zu machen.Entschuldige diese harte Kritik, aber solch ein Script wird Dir vermutlich niemand debuggen, weil es einem neuschreiben gleichkommt.
-
-
Das kannst Du entweder per AdlibEnable() oder per TimerInit() und TimerDiff() lösen.
-
Sorry, dass ich das sagen muss, aber solch einen 'Spaghetti-Code' kann man nur sehr schwer verstehen. Es fehlt einfach die Motivation diese (fast 500) Zeilen durchzugehen. Reduzier Dein Problem auf ein kurzes Beispiel, dann wird Dir sicher schneller geholfen werden.
-
Oder so:
[autoit]
[/autoit]
#Include <File.au3>
#Include <Array.au3>
$FileList = _FileListToArray('c:\inv_Dateien', '*.out', 1)
If @Error Then
MsgBox (0,'','No Files/Folders Found.')
Exit
EndIf
_ArrayDisplay($FileList, '$FileList') -
Das uploaden der Bilder etc. auf den FTP-Server kannst Du am besten mit einem FTP-Programm machen oder, wie ich, mit dem TotalCommander.
Das Script zum downloaden könnte so aussehen:
[autoit]
[/autoit][autoit][/autoit][autoit]
$user = 'autoit' ; Benutzername
$pass = 'autoit1' ; Passwort$datei = 'test.jpg' ; die Datei, die gedownloadet werden soll
[/autoit][autoit][/autoit][autoit]$ziel = 'bla.jpg' ; wie die Datei dann auf dem lokalen Rechner heißen soll
[/autoit][autoit][/autoit][autoit]$size = InetGetSize('ftp://' & $user & ':' & $pass & '@e2m2.dyndns.org/' & $datei) ; Dateigröße holen
[/autoit][autoit][/autoit][autoit]$r = InetGet('ftp://' & $user & ':' & $pass & '@e2m2.dyndns.org/' & $datei, $ziel, 1, 1) ; Datei downloaden (Script nicht anhalten)
[/autoit]
SplashTextOn('Download', 'test', 320, 80)
While @InetGetActive
ControlSetText('Download', '', 'Static1', 'Download = ' & @InetGetBytesRead & ' von ' & $size & ' Bytes')
Sleep(20)
Wend
SplashOff()
MsgBox(0, 'Download', 'Download erfolgreich') -
Version: 3.4.2.5
- Dialog für 'Netzlaufwerk verbinden' erweitert. Man kann jetzt mehrere Profile anlegen, in
denen Pfad, Benutzername und Passwort gespeichert werden.Screenshot:
bild2.gifP.S.: Der Eintrag ist nur zum testen. Den gibt es nicht wirklich.
-
Änderungen:
- 'Netzlaufwerk verbinden' jetzt mit eigenem GUI-Fenster
Version: 3.4.2.3
-
Auch von mir: Alles Gute zum Geburtstag!
Wir haben ja am gleichen Tag Geburtstag. Auch wenn ich mehr als zweieinhalb mal so alt bin.
-
Huch!
Da wäre mir doch beinahe beim programmieren dieser Thread entgangen.Vielen Dank für die vielen guten Wünsche.
@xeno: Ja, wenn man erstmal die 4 vorne stehen hat...
Geburtstagsfeier findet dann erst morgen statt, wenn alle Freunde und Bekannte Zeit haben.
-
Neue Version!
Änderungen:
- Netzlaufwerk trennen
- Netzlaufwerk verbinden
Version: 3.4.2.2
-
Stimmt die eine Zeile war fehlerhaft, aber Deine Korrektur ist auch nicht ganz richtig.
[autoit]
Die Zeile müsste so aussehen:
[/autoit]
If ($aDriveletter[$disk][$part + $epart] <> StringReplace($Dep[0], '"', '')) Then $epart += 1Es geht ja darum, dass, wenn mit der gleichen $disk und der gleichen $part ein anderer Buchstabe auftaucht, dass es sich dann um eine erweiterte Partition handelt. Ich erhöhe dann $epart um eins, so dass in $aDriveletter beide/alle Buchstaben unter der $disk enthalten sind. Das ist wichtig für die Zuordnung Buchstabe <-> Physikalisches Laufwerk.
Edit: Und in _CreateDrives() solltest Du nur diese Zeile...
[autoit]
[/autoit]
GUICtrlSetImage($aIcon[$i], @SystemDir & '\shell32.dll', -8)...einfügen. Damit Du weißt wo, hatte ich den Rest mit gepostet.
Zu verwirrend? Hier die ganze Funktion:
[autoit]
[/autoit]
Func _CreateDrives()
Local $k = 0, $writer, $checkDGT
$Colors = _Gradient($cProgressBGColor, $cProgressBGEndColor, $aFDrive[0] * 2)
$GUICtrlbegin = GUICtrlCreateDummy()
For $i = 0 To $aFDrive[0] - 1
$checkDGT = DriveGetType($aFDrive[$i + 1])
Switch $checkDGT
Case 'RAMDisk'
$icon = -13
$cPFC = $cProgressFrontColor
$cPFGC = $cProgressFrontGradColor
Case 'CDROM'
$writer = _CheckWriter($aFDrive[$i + 1])
$icon = -12
If DriveStatus($aFDrive[$i + 1]) = 'READY' Then
$cPFC = 0x555588; 1. Farbe für CDROM
$cPFGC = 0x6666CC; 2. Farbe für CDROM
Else
$cPFC = 0xDDDDDD; 1. Farbe für 'kein Datenträger'
$cPFGC = 0xEEEEEE; 2. Farbe für 'kein Datenträger'
EndIf
Case 'Removable'
$icon = -8
$cPFC = $cProgressFrontColor
$cPFGC = $cProgressFrontGradColor
Case 'Fixed'
$icon = -9
$cPFC = $cProgressFrontColor
$cPFGC = $cProgressFrontGradColor
Local $reg, $j, $tmp, $val = ''
$reg = RegRead('HKLM\SYSTEM\MountedDevices', '\DosDevices\' & $aFDrive[$i + 1])
If Not @error Then
For $j = 1 To StringLen($reg) - 2 Step 2
$tmp = _HexToString(StringMid($reg, $j, 2))
If $tmp <> '' Then
$val &= $tmp
EndIf
Next
If $val = 'TrueCrypt' Then $icon = -48
EndIf
Case 'Network'
If DriveStatus($aFDrive[$i + 1]) = 'READY' Then
$icon = -10
Else
$icon = -11
EndIf
$cPFC = $cProgressFrontColor
$cPFGC = $cProgressFrontGradColor
EndSwitch
$aIcon[$i] = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', $icon, 12, 2 + $i * 50, 32, 32)
GUICtrlSetTip(-1, "Explorer auf " & StringUpper($aFDrive[$i + 1]))
GUICtrlSetCursor(-1, 0)
GUICtrlSetOnEvent(-1, "_Explore")
GUICtrlSetState(-1, $GUI_ONTOP)
If $writer Then
$aIconH[$i] = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', -147, 34, 26 + $i * 50, 16, 16)
EndIf
$aCMNicon[$i] = $aFDrive[$i + 1]
$aCMicon[$i] = GUICtrlCreateContextMenu($aIcon[$i])
$aCM1icon[$i] = GUICtrlCreateMenuItem('Datenträger-Informationen', $aCMicon[$i])
GUICtrlSetOnEvent(-1, "_DTInfo")
If $checkDGT = 'Removable' Then
$aCM2icon[$i] = GUICtrlCreateMenuItem('Datenträger abmelden', $aCMicon[$i])
GUICtrlSetOnEvent(-1, '_EjectMedia')
EndIf
If ($checkDGT = 'FIXED') And (_CheckIfUSB($aFDrive[$i + 1]) = 1) Then
$aCM2icon[$i] = GUICtrlCreateMenuItem('Datenträger abmelden', $aCMicon[$i])
GUICtrlSetOnEvent(-1, '_RemoveDrive')
GUICtrlSetImage($aIcon[$i], @SystemDir & '\shell32.dll', -8)
EndIf
$aProgress[$i] = _ProgressCreate(52, 8 + $i * 50, 230, 20, $cPFC, $cPFGC, $Colors[$k], $Colors[$k + 1])
If $checkDGT = 'CDROM' Then
$aLWname[$iNumCD] = $aFDrive[$i + 1]
$aLWo[$iNumCD] = GUICtrlCreateButton('Open', 295, 8 + $i * 50, 35, 20)
GUICtrlSetFont(-1, 8, 800, 0, 'Arial')
GUICtrlSetOnEvent(-1, '_LWopenclose')
GUICtrlSetState(-1, $GUI_ONTOP)
$aLWc[$iNumCD] = GUICtrlCreateButton('Close', 335, 8 + $i * 50, 35, 20)
GUICtrlSetFont(-1, 8, 800, 0, 'Arial')
GUICtrlSetOnEvent(-1, '_LWopenclose')
GUICtrlSetState(-1, $GUI_ONTOP)
$iNumCD += 1
Else
$aProzent[$i] = GUICtrlCreateLabel('', 290, 8 + $i * 50, 70, 20, $ES_RIGHT, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont(-1, 9, 700, 0, 'Arial')
$aGB[$i] = GUICtrlCreateLabel('', 290, 30 + $i * 50, 70, 20, $ES_RIGHT, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont(-1, 8, 800, 0, 'Arial')
GUICtrlSetColor(-1, $cGBColor); Farbe der GB-Zahl
EndIf
$k += 2
$aName[$i] = GUICtrlCreateLabel('', 52, 30 + $i * 50, 230, 21)
GUICtrlSetFont(-1, 8, 800, 0, 'Arial')
GUICtrlSetColor(-1, $cTextColor); Farbe der Beschriftung unter der Progressbar
GUICtrlSetBkColor(-1, $cTextBGColor); Farbe des Hintergrundes der Beschriftung unter der Progressbar
Next
$GUICtrlend = GUICtrlCreateDummy()
EndFunc ;==>_CreateDrives -
Ich habe noch zwei kleine Änderungen vorgenommen:
In der Funktion _DTInfo():
[autoit]
[/autoit]
Case 'Fixed'
If _CheckIfUSB($aCMNicon[$i]) Then
$sDGT = 'USB-Festplatte'
Else
$sDGT = 'Festplatte'
EndIfUnd in der Funktion _CreateDrives():
[autoit]
[/autoit]
If ($checkDGT = 'FIXED') And (_CheckIfUSB($aFDrive[$i+1]) = 1) Then
$aCM2icon[$i] = GUICtrlCreateMenuitem('Datenträger abmelden', $aCMicon[$i])
GUICtrlSetOnEvent(-1,'_RemoveDrive')
GUICtrlSetImage($aIcon[$i], @SystemDir & '\shell32.dll', -8)
EndIfDamit man eine USB-Festplatte von einer internen Festplatte unterscheiden kann.
-
@Xeno: Das mit den externen Festplatten ist mir erst durch Deinen Hinweis aufgefallen. Ich dachte, die binden sich auch als Wechseldatenträger ein und könnten ebenfalls per EjectMedia entfernt werden.
Ich habe das jetzt mit RemoveDrive gelöst.
Außerdem habe ich die Funktion _NetworkDrive() entfernt. Die gab es bereits in Form von DriveMapGet().
Version 3.4.1.5
-
Hmmm...ich habe bereits eine Schnellstartleiste (unten neben der Taskleiste). Wo ist der Sinn etwas in die SpaceBar zu packen statt nach unten?
-
Coole Sache! Jetzt geht das ein-/ausfahren viel schneller.
Das mit der Transparenz finde ich persönlich überflüssig, aber das ist ja Geschmackssache.
Bei der _Refresh()-Funktion bleibe ich aber lieber beim:
[autoit]
[/autoit]
GUISetState(@SW_HIDE, $GUI)
[...]
GUISetState(@SW_SHOW, $GUI)Das kurze aus- und wieder einblenden ist mir lieber als das 'Blättern' der GUI-Elemente.
Trotzdem: Gute Zusammenarbeit! So nebenbei lerne ich immer noch was dazu.
Ich fürchte nur, mir sind die Ideen ausgegangen. Mir fallen keine Erweiterungsmöglichkeiten mehr ein.