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-Key: 227552

Url: https://administrator.de/contentid/227552

Printed on: April 19, 2024 at 08:04 o'clock

Member: colinardo
Solution colinardo Jan 23, 2014, updated at Jan 27, 2014 at 09:38:27 (UTC)
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
Member: pytrelooc
pytrelooc Jan 24, 2014 at 09:03:08 (UTC)
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
Member: colinardo
Solution colinardo Jan 24, 2014, updated at Jan 27, 2014 at 09:38:24 (UTC)
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
Member: pytrelooc
pytrelooc Jan 27, 2014 at 09:14:16 (UTC)
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
Member: colinardo
Solution colinardo Jan 27, 2014 updated at 09:38:22 (UTC)
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
Member: pytrelooc
pytrelooc Jan 27, 2014 at 09:38:17 (UTC)
Goto Top
Das habe ich mir schon gedacht.
Vielen Dank für deine Hilfe !

Gruß pytrelooc