pytrelooc
Goto Top

AutoIT Progress Bar während Funktion

Hallo Leute,

ich würde gerne eine Progress Bar solange laufen lassen wie eine Funktion dauert in welcher ich eine Datei auslese.
Meine Funktion sieht so aus:

Func ComputeStatusFileRead()

	Local $File_Pointer, $File_Line
	Local $Count_Line

	GUICtrlSetData($Edit_UserList, "")  

	If FileExists("c:\temp\" & $sCServerUser) Then  
		$File_Pointer= FileOpen("c:\temp\" & $sCServerUser,0)  
		IF $File_Pointer <> -1 Then
			$Count_Line=1
			While 1
				$File_Line=FileReadLine($File_Pointer, $Count_Line)
				If @error = -1 Then ExitLoop
				$Count_Line = $Count_Line+1
				; ConsoleWrite( $Count_Line & ' ' & $File_Line & @CRLF)  
				; User Liste ausgeben
				GUICtrlSetData($Edit_UserList, $File_Line & @CRLF, 1)
			WEnd
			FileClose($File_Pointer)
		EndIf
	Else
		MsgBox(0,"Error","File " & $sCServerUser & " could not be opened")  
	EndIf
 EndFunc

Da diese Funktion aber etwas dauert wollte ich eine Progress Bar für diese Zeit laufen lassen.

Diese habe ich so geschrieben:

Func LoadingScreen()

local $progress = 0



while $progress <> 110
$progress+=1
guictrlsetdata($Progress1,$progress)
sleep(70)
WEnd

GUIDelete($Form5)
GUISetState(@SW_SHOW, $Form1)

EndFunc

gibt es eine Möglichkeit eine Progressbar gleichzeitig mit der Funktion laufen zu lassen ?
Multithreading ist ja nicht möglich in AutoIT aber evtl. gibt es ja einen Trick wie man das lösen könnte ?

Viellicht könnt ihr mir ja helfen

Gruß

Pytrelooc

Content-ID: 227552

Url: https://administrator.de/forum/autoit-progress-bar-waehrend-funktion-227552.html

Ausgedruckt am: 23.04.2025 um 16:04 Uhr

colinardo
Lösung colinardo 23.01.2014, aktualisiert am 27.01.2014 um 10:38:27 Uhr
Goto Top
Hallo Pytrelooc,
warum machst du das Update der Progress-Bar nicht direkt aus der eigentlichen Funktion die die Arbeit erledigt, dort könntest du dann auch berechnen (anhand deines Counters) wie lange es noch dauert und die Progress-Bar entsprechend prozentual updaten.

Beispiel:
#NoTrayIcon
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)  
$Form1 = GUICreate("Form1", 296, 117, 192, 124)  
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")  
$Progress1 = GUICtrlCreateProgress(16, 16, 257, 25)
$btnStart = GUICtrlCreateButton("Start", 104, 64, 75, 25, $WS_GROUP)  
GUICtrlSetOnEvent(-1, "btnStartClick")  
GUISetState(@SW_SHOW)

While 1
	Sleep(100)
WEnd

Func btnStartClick()
	GUICtrlSetState($btnStart,$GUI_DISABLE)
	meineFunktion()
	GUICtrlSetState($btnStart,$GUI_ENABLE)
EndFunc

Func Form1Close()
	exit
EndFunc


Func meineFunktion()
	$zeilen = 530
	for $i = 1 to $zeilen
		$percent = Round(($i / $zeilen) * 100,0)
		GUICtrlSetData($Progress1,$percent)
		Sleep(10)
	next
EndFunc
Grüße Uwe
pytrelooc
pytrelooc 24.01.2014 um 10:03:08 Uhr
Goto Top
Hallo Uwe,

ich verstehe leider nicht wo ich nun meinen Code platzieren muss damit die Progressbar parallel zur Ausführung abläuft.

Gruß Pytrelooc
colinardo
Lösung colinardo 24.01.2014, aktualisiert am 27.01.2014 um 10:38:24 Uhr
Goto Top
Zitat von @pytrelooc:
ich verstehe leider nicht wo ich nun meinen Code platzieren muss damit die Progressbar parallel zur Ausführung abläuft.
ich weiß zwar nicht wie deine Form aufgebaut ist, aber im Prinzip sähe deine Function dann so aus:
#include <File.au3>

Func ComputeStatusFileRead()

	Local $File_Pointer, $File_Line
	Local $Count_Line

	GUICtrlSetData($Edit_UserList, "")  

	If FileExists("c:\temp\" & $sCServerUser) Then  
		$File_Pointer= FileOpen("c:\temp\" & $sCServerUser,0)  
		
		;Gesamtanzahl Zeilen in der Datei in Variable speichern
		$anzahlZeilen = _FileCountLines("c:\temp\" & $sCServerUser)  

		IF $File_Pointer <> -1 Then
			$Count_Line=1
			While 1
				$File_Line=FileReadLine($File_Pointer, $Count_Line)
				If @error = -1 Then ExitLoop
				$Count_Line = $Count_Line+1
				; ConsoleWrite( $Count_Line & ' ' & $File_Line & @CRLF)  
				; User Liste ausgeben
				GUICtrlSetData($Edit_UserList, $File_Line & @CRLF, 1)
				
				;ProgressBar Wert setzen
				$percent = Round(($Count_Line / $anzahlZeilen) * 100,0) 
				GUICtrlSetData($Progress1,$percent) 
			WEnd
			FileClose($File_Pointer)
		EndIf
	Else
		MsgBox(0,"Error","File " & $sCServerUser & " could not be opened")  
	EndIf
 EndFunc
Grüße Uwe
pytrelooc
pytrelooc 27.01.2014 um 10:14:16 Uhr
Goto Top
Okey so funktioniert es face-smile

Vielen Dank !

ist es auch möglich während einem RUNWAIT den Ladebalken laufen zu lassen ?
Da dies nur eine Zeile ist wüsste ich jetzt nicht wie man das machen könnte.
Es muss auch gar nicht genau nach Fortschritt laufen, die Hauptsache wäre wenn es zur gleichen Zeit fertig ist wie das RUNWAIT.

Gruß

pytrelooc
colinardo
Lösung colinardo 27.01.2014 aktualisiert um 10:38:22 Uhr
Goto Top
Das wäre nur mit MultiThreading möglich: http://www.autoitscript.com/forum/topic/29326-another-multi-process-hel ...

oder du baust dir ein zusätzliches AutoIt Script mit einer Form welche nur aus einer ProgressBar besteht, welche du aus deinem jetzigen Script aufrufst, und die dann nach dem Durchlauf deines Jobs durch dein Haupt-Script geschlossen wird.

Grüße Uwe
pytrelooc
pytrelooc 27.01.2014 um 10:38:17 Uhr
Goto Top
Das habe ich mir schon gedacht.
Vielen Dank für deine Hilfe !

Gruß pytrelooc