none
Probleme mit Timer RRS feed

  • Frage

  • Hallo zusammen,

    ich habe follgendes Problem und komme einfach nicht weiter...

    also ich überwache per FileSystemWatcher 2 Dateien. Sobald eine Änderung festgestellt wurde, erscheint ein Fenster mit der Änderung, es kann auch der Grund für die Änderung eingegeben werden!

    Auf diesem Fenster soll nun mithilfe eines Buttons die Überwachung für eine gewisse Zeit ausgeschalten werden. Sobald der Button gedrückt wird, läuft eine Zeitleiste ab, die die restliche Ausschaltzeit darstellen soll. Wird nun der Button "Fenster Exit" gedrückt (zuvor wurde auf den Button "Fenster für ... aus" gedrückt), soll die restliche Zeit an einen zweiten Timer übergeben werden. Wenn die Zeit abgelaufen ist, soll bei einer Änderung an der Datei das Fenster wieder erscheinen.

    Leider bekomme ich den 2ten Timer nicht zum laufen... Könnte man dies nicht auch einfacher lösen? Ein Timer? Ich habe schon alles mögliche versucht... Aber da ich das Fenster in einem Job anzeigen lasse, glaube ich, dass ich zwei Timer benötige...

    Hier mal der Code:

    cls
    #Zu überwachende Dateien
    $Global:TestFile = @("C:\Users\noz.dat","C:\Users\wie\tra.dat") 
    #Leere HashTable erstellen
    $Var = @{}
    #HashTable füllen
    $Var.Änderungsgrund = $NULL
    $Var.TimerFenster_AUS_läuft = $FALSE
    $Var.FensterRestzeit = 0
    $Var.TimerFenster_MIN = 1
    $Var.ProgressBarMaximum = $Var.TimerFenster_MIN * 60 
    #FSW-Event 
    $OnChange = {
    	
    	#Ausführen, wenn TimerFenster_AUS_läuft = $FALSE
    	IF ($Var.TimerFenster_AUS_läuft -eq $FALSE) {
    		
    		#Pfad der geänderten Datei + Zeitpunkt der Änderung an $Var.Änderung übergeben und anschließend in Konsole ausgeben
    		$Var.Änderung = “{0} am {1:d} geändert!” –f $eventArgs.FullPath, $Event.TimeGenerated.DateTime
    		Write-Host $Var.Änderung
    		
    		#Fenster als Job aufrufen
    		$Job = Start-Job -ArgumentList ($Var) -ScriptBlock {
    			
    			# Argument wieder in HashTable casten
    			$VarJob = [HashTable]$args[0]		
    			
    			#Assemblies laden
    			[void] [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
    			[void] [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null 
    			
    			#Fenster Grundgerüst
    			$Form = New-Object System.Windows.Forms.Form  
    			$Form.TopMost = $true 
    			$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedToolWindow  
    			$Form.StartPosition = "CenterScreen" 
    			$Form.Size = New-Object System.Drawing.Size(1000,350)
    			
    			#Text: $VarJob.Änderung 
    			$LabelÄnderung = New-Object "System.Windows.Forms.Label"
    			$LabelÄnderung.Text = $VarJob.Änderung
    			$LabelÄnderung.Font = New-Object System.Drawing.Font("Courier New",10,[System.Drawing.FontStyle]::Regular)
    			$LabelÄnderung.TextAlign = 'MiddleLeft' 
    			$LabelÄnderung.Location = New-Object System.Drawing.Size(10,10) 
    			$LabelÄnderung.Size = New-Object System.Drawing.Size(1000,50)
    			#Text: "Änderungsgrund:"
    			$LabelÄnderungsgrund = New-Object "System.Windows.Forms.Label"
    			$LabelÄnderungsgrund.Text = "Änderungsgrund:" 
    			$LabelÄnderungsgrund.Font = New-Object System.Drawing.Font("Courier New",10,[System.Drawing.FontStyle]::Regular)
    			$LabelÄnderungsgrund.TextAlign = 'MiddleLeft' 
    			$LabelÄnderungsgrund.Location = New-Object System.Drawing.Size(10,50) 
    			$LabelÄnderungsgrund.Size = New-Object System.Drawing.Size(950,50)
    			
    			#Eingabe: Änderungsgrund
    			$InputboxÄnderungsgrund = New-Object System.Windows.Forms.Textbox 
    			$InputboxÄnderungsgrund.Font = New-Object System.Drawing.Font("Courier New",10,[System.Drawing.FontStyle]::Regular)
    			$InputboxÄnderungsgrund.Location = New-Object System.Drawing.Size(10,100) 
    			$InputboxÄnderungsgrund.Size = New-Object System.Drawing.Size(950,50)
    			#Button: Fenster für ... ausschalten
    			$ButtonFenster_AUS = New-Object System.Windows.Forms.Button 
    			$ButtonFenster_AUS.Text = "Fenster " + $VarJob.TimerFenster_MIN + " min aus?"
    			$ButtonFenster_AUS.Font = New-Object System.Drawing.Font("Courier New",10,[System.Drawing.FontStyle]::Regular)
    			$ButtonFenster_AUS.TextAlign = 'MiddleLeft'
    			$ButtonFenster_AUS.Location = New-Object System.Drawing.Size(10,150) 
    			$ButtonFenster_AUS.Size = New-Object System.Drawing.Size(200,50)
    			$ButtonFenster_AUS.Add_Click({				
    				#Timer registrieren
    				TRY {Register-ObjectEvent -InputObject $Timer -EventName tick –SourceIdentifier Timer -ErrorAction Stop}
    				CATCH {write-host $error[0].exception.Message}
    				#Timer starten
    				TRY {$ErrorActionPreference = "Stop"; $Timer.start()}
    				CATCH {write-host $error[0].exception.Message}
    				
    				#Timer-Zeitleiste auf Grundgerüst setzen
    				$Form.Controls.Add($ProgressBarTimer)
    				
    				$VarJob.TimerFenster_AUS_läuft = $TRUE
    				})
    			
    			#Timer-Zeitleiste
    			$ProgressBarTimer = New-Object System.Windows.Forms.ProgressBar
    			$ProgressBarTimer.DataBindings.DefaultDataSourceUpdateMode = 0
    			$ProgressBarTimer.Maximum = $VarJob.ProgressBarMaximum
    			$ProgressBarTimer.Step = 1
    			$ProgressBarTimer.Location = New-Object System.Drawing.Size(250,150) 
    			$ProgressBarTimer.Size = New-Object System.Drawing.Size(710,50)
    			
    			#Button: Fenster verlassen
    			$ButtonFenster_EXIT = New-Object System.Windows.Forms.Button 
    			$ButtonFenster_EXIT.Font = New-Object System.Drawing.Font("Courier New",10,[System.Drawing.FontStyle]::Regular)
    			$ButtonFenster_EXIT.TextAlign = 'MiddleLeft' 
    			$ButtonFenster_EXIT.Location = New-Object System.Drawing.Size(10,250) 
    			$ButtonFenster_EXIT.Size = New-Object System.Drawing.Size(200,50)
    			$ButtonFenster_EXIT.Text = "Fenster EXIT!"
    			$ButtonFenster_EXIT.Add_Click({
    				#Änderungsgrund an $VarJob.Änderungsgrund übergeben
    				$VarJob.Änderungsgrund = $InputboxÄnderungsgrund.Text
    				
    				#Fenster schließen
    				$Form.Close()
    				$Form.Dispose()
    				})
    			#Timer init
    			$Timer = New-Object System.Windows.Forms.Timer
    			$Timer.Interval = 1000
    			$Timer.Add_Tick({&$Timer_OnTick})
    			 
    			#Timer-Tick Event 
    			$Timer_OnTick = {
    			
    				$ProgressBarTimer.PerformStep()
    				$VarJob.FensterRestzeit = $VarJob.ProgressBarMaximum - $ProgressBarTimer.Value
    				[char[]]$mins = "{0}" -f ($VarJob.FensterRestzeit / 60)
    				$secs = "{0:00}" -f ($VarJob.FensterRestzeit % 60)
    				$ButtonFenster_AUS.Text = "Fenster noch {0}:{1} aus!" -f $mins[0], $secs
    					 
    				IF ($ProgressBarTimer.Value -eq $VarJob.ProgressBarMaximum) {
    					Unregister-Event Timer -ErrorAction Stop
    					$Timer.stop()
    					$Form.Controls.Remove($ProgressBarTimer)
    					$ProgressBarTimer.Value = 0
    					$ButtonFenster_AUS.Text = "Fenster " + $VarJob.TimerFenster_MIN + " min aus?"
    					$VarJob.TimerFenster_AUS_läuft = $FALSE
    				}
    			}
    		
    			#Elemente einbinden
    			$Form.Add_Load()
    			$Form.Add_Closed()
    			$Form.Controls.Add($ButtonFenster_AUS) 
    			$Form.Controls.Add($ButtonFenster_EXIT)
    			$Form.Controls.Add($ButtonÄnderung)
    			$Form.Controls.Add($LabelÄnderungsgrund)
    			$Form.Controls.Add($InputboxÄnderungsgrund)
    			$Form.Controls.Add($LabelÄnderung)
    			
    			# Fenster anzeigen
    			$Form.ShowDialog()| Out-Null
    		
    			#Return Hash	
    			$VarJob
    		}
    		
    		#Auf Eingabe warten
    		Wait-Job $job
    		
    		#Variablen abholen
    		$Var = [HashTable](Receive-Job $job)	
    		#Änderungsgrund an Konsole übergeben
    		Write-host "Änderungsgrund: " $Var.Änderungsgrund
    	}
    	#Ausführen, wenn TimerFenster_AUS_läuft = $TRUE
    	IF ($Var.TimerFenster_AUS_läuft -eq $TRUE) {
    		
    		#Timer-Restzeit in Konsole ausgeben 
    		Write-Host "Timer-Restzeit: " $Var.FensterRestzeit
    		
    		#Timer1 init
    		$Timer1 = New-Object System.Windows.Forms.Timer
    		$Timer1.Interval = 1000
    		$Timer1.add_tick({&$Timer1_OnTick})
    		
    		#Timer1-Tick Event
    		$Timer1_OnTick = {
    			$Var.FensterRestzeit = $Var.FensterRestzeit - 1
    			
    			#Ausführen, wenn $Var.FensterRestzeit = 0
    			IF ($Var.FensterRestzeit -eq 0) {
    				Unregister-Event Timer1 -ErrorAction Stop
    				#$ButtonFenster_AUS.Text = "Fenster " + $Var.TimerFenster_MIN + " min aus?"
    				$Var.TimerFenster_AUS_läuft = $FALSE
    			}
    		}			
    		#Timer registrieren
    		TRY {Register-ObjectEvent -InputObject $Timer1 -EventName tick –SourceIdentifier Timer1 -ErrorAction Stop}
    		CATCH {write-host $error[0].exception.Message}
    		#Timer starten
    		TRY {$ErrorActionPreference = "Stop"; $Timer1.start()}
    		CATCH {write-host $error[0].exception.Message}
    	}
    }
    #FileSystemWatcher
    $cnt = 1
    foreach ($FileName in $TestFile) {  
    	$watchername = '$FSW' + $cnt
    	$watchername = new-object system.io.filesystemwatcher 
    	$watchername.Path = (Split-Path $FileName)
    	$watchername.IncludeSubdirectories = $False  
    	$watchername.Filter = (Split-Path $FileName -leaf)  
    	$watchername.EnableRaisingEvents = $True
    	Register-ObjectEvent -InputObject $watchername -EventName Changed -Action $OnChange | Out-Null
    	++$cnt;
    }
    Ich hoffe mir kann einer helfen. Vielen dank

    Mittwoch, 7. Mai 2014 21:09

Antworten

  • Hab nun eine lösung, trotzdem danke...

    	#Ausführen, wenn TimerFenster_AUS_läuft = $TRUE
    	IF ($Var.TimerFenster_AUS_läuft -eq $TRUE) {
    		$length = $Var.FensterRestzeit / 100
    		while ($Var.FensterRestzeit -gt 0) {  
    			Write-Host "Timer-Restzeit: " $Var.FensterRestzeit
    			start-sleep -s 1 
    			$Var.FensterRestzeit--
    			IF ($Var.FensterRestzeit -eq 0) {
    				$Var.TimerFenster_AUS_läuft = $FALSE
    				$Var.FensterRestzeit = 0
    			}
    		} 	
    	}

    • Als Antwort vorgeschlagen Peter Kriegel Freitag, 9. Mai 2014 10:20
    • Als Antwort markiert Mitsch86 Freitag, 9. Mai 2014 13:40
    Freitag, 9. Mai 2014 01:30

Alle Antworten

  • Oder ist es möglich einen 2ten Job zu starten aus dem ersten Job heraus?

    Denke ich komplett falsch und sollte anderst an die Sache gehen?

    Vielen Dank schonmal im Vorraus...

    Donnerstag, 8. Mai 2014 12:30
  • Hab nun eine lösung, trotzdem danke...

    	#Ausführen, wenn TimerFenster_AUS_läuft = $TRUE
    	IF ($Var.TimerFenster_AUS_läuft -eq $TRUE) {
    		$length = $Var.FensterRestzeit / 100
    		while ($Var.FensterRestzeit -gt 0) {  
    			Write-Host "Timer-Restzeit: " $Var.FensterRestzeit
    			start-sleep -s 1 
    			$Var.FensterRestzeit--
    			IF ($Var.FensterRestzeit -eq 0) {
    				$Var.TimerFenster_AUS_läuft = $FALSE
    				$Var.FensterRestzeit = 0
    			}
    		} 	
    	}

    • Als Antwort vorgeschlagen Peter Kriegel Freitag, 9. Mai 2014 10:20
    • Als Antwort markiert Mitsch86 Freitag, 9. Mai 2014 13:40
    Freitag, 9. Mai 2014 01:30