Laden...

Schleife nach bestimmter Zeit erneut ausführen

Erstellt von Nierewa vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.504 Views
N
Nierewa Themenstarter:in
15 Beiträge seit 2019
vor 4 Jahren
Schleife nach bestimmter Zeit erneut ausführen

Hallo,

ich bin Anfänger und habe eine Frage, die wahrscheinlich manche zum Lachen bringt.

In meinem Quellcode habe ich eine Foreach-Schleife.
Diese soll alle 15 Sekunden ausgeführt werden so lange das Programm offen ist.

Es handelt sich um eine Windows-Anwendung bei der eun Notification Icon im Systray zu sehen ist, sonst nichts.
Den Code Schnippsel habe ich von hier: https://dotnet-snippets.de/snippet/v...-anwendung/541

und hier ist der Code:


/*
 * Erstellt mit SharpDevelop.
 * Datum: 02.09.2019
 * Zeit: 13:24
 *
 * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
 */
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;

namespace Zuarbeit
{
    /// <summary>
    /// Class with program entry point.
    /// </summary>
    internal sealed class Program
    {
        /// <summary>
        /// Program entry point.
        /// </summary>  


//*****************************************************************************
static class MyNotifyIconApplication
{
   private static NotifyIcon  notico;

    //==========================================================================
   public static void Main (string [] astrArg)
   {
              string fileName = "";
              string sourcePath = @"Z:\DHL\";
              string targetPath =  @"Z:\DHL\Versand\";

              // hier werden die Pfade angegeben
              string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
              string destFile = System.IO.Path.Combine(targetPath, fileName);

              foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {

                // Eine Backupdatei von der Quelldatei anlegen
                fileName = System.IO.Path.GetFileNameWithoutExtension(fn);
               destFile = System.IO.Path.Combine(sourcePath, fileName+".bak");
               System.IO.File.Copy(fn, destFile, true);

               // in der Textdatei alle # mit | ersetzen.
               string text = File.ReadAllText(fn);
               text = text.Replace("#", "|");
               File.WriteAllText(fn, text);

               // die Datei in den Zielordner kopieren und danach löschen - hier könnte wohl auch gleich verschoben werden ^^
               fileName = System.IO.Path.GetFileName(fn);
               destFile = System.IO.Path.Combine(targetPath, fileName);
               System.IO.File.Copy(fn, destFile, true);
               System.IO.File.Delete(fn);
              }

      ContextMenu cm;
      MenuItem    miCurr;
      int         iIndex = 0;

      // Kontextmenü erzeugen
      cm = new ContextMenu ();

      // Kontextmenüeinträge erzeugen
      miCurr = new MenuItem ();
      miCurr.Index = iIndex++;
      miCurr.Text = "&Aktion 1";           // Eigenen Text einsetzen
      miCurr.Click += new System.EventHandler (Action1Click);
      cm.MenuItems.Add (miCurr);

      // Kontextmenüeinträge erzeugen
      miCurr = new MenuItem ();
      miCurr.Index = iIndex++;
      miCurr.Text = "&Beenden";
      miCurr.Click += new System.EventHandler (ExitClick);
      cm.MenuItems.Add (miCurr);

      // NotifyIcon selbst erzeugen
      notico = new NotifyIcon ();
      notico.Icon = new Icon("smile.ico"); // Eigenes Icon einsetzen
      notico.Text = "Doppelklick mich!";   // Eigenen Text einsetzen
      notico.Visible = true;
      notico.ContextMenu = cm;
      notico.DoubleClick += new EventHandler (NotifyIconDoubleClick);

      // Ohne Appplication.Run geht es nicht
      Application.Run ();
   }

   //==========================================================================
   private static void ExitClick (Object sender, EventArgs e)
   {
      notico.Dispose ();
      Application.Exit ();
   }

   //==========================================================================
   private static void Action1Click (Object sender, EventArgs e)
   {
      // nur als Beispiel:
      // new MyForm ().Show ();
   }

   //==========================================================================
   private static void NotifyIconDoubleClick (Object sender, EventArgs e)
   {
      // Was immer du willst
   }

}
    }
}

Danke 😁

2.298 Beiträge seit 2010
vor 4 Jahren

Im einfachsten Fall empfehle ich dir die Verwendung eines Timers.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

N
Nierewa Themenstarter:in
15 Beiträge seit 2019
vor 4 Jahren

Hmm,

das hab ich mir auch schon überlegt und hab per Google einiges zusammengesucht und probiert. Doch leider erhalte ich mit diesem Code:

/*
 * Erstellt mit SharpDevelop.
 * Benutzer: Rettig
 * Datum: 02.09.2019
 * Zeit: 13:24
 * 
 * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
 */
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
using System.Timers;

namespace Zuarbeit
{
	/// <summary>
	/// Class with program entry point.
	/// </summary>
	internal sealed class Program
	{
		/// <summary>
		/// Program entry point.
		/// </summary>  


//*****************************************************************************
static class MyNotifyIconApplication
{
   private static NotifyIcon  notico;

    //==========================================================================
   public static void Main (string [] astrArg)
   {
              Timer t1 = new Timer(); // Timer anlegen
			  t1.Interval = 100; // Intervall festlegen, hier 100 ms
			  t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
			  t1.Start(); // Timer starten


   	          string fileName = "";
	          string sourcePath = @"Z:\DHL\";
	          string targetPath =  @"Z:\DHL\Versand\";
	
	          // Use Path class to manipulate file and directory paths.
	          string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
	          string destFile = System.IO.Path.Combine(targetPath, fileName);

		      
	          void t1_Tick(object sender, EventArgs e)
			  {
	          foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {
           
           	  	// Eine Backupdatei von der Quelldatei anlegen 
                fileName = System.IO.Path.GetFileNameWithoutExtension(fn);
	           destFile = System.IO.Path.Combine(sourcePath, fileName+".bak");
	           System.IO.File.Copy(fn, destFile, true);
	           
	           // in der Textdatei alle # mit | ersetzen.
	           string text = File.ReadAllText(fn);
	           text = text.Replace("#", "|");
	           File.WriteAllText(fn, text);
	           
	           
	           
	           // die Datei in den Zielordner kopieren und danach löschen
	           fileName = System.IO.Path.GetFileName(fn);
	           destFile = System.IO.Path.Combine(targetPath, fileName);
	           System.IO.File.Copy(fn, destFile, true);
	           System.IO.File.Delete(fn);
	           MessageBox("nochmal");
              }
	          }
   	
   	  ContextMenu cm;
      MenuItem    miCurr;
      int         iIndex = 0;

      // Kontextmenü erzeugen
      cm = new ContextMenu ();

      // Kontextmenüeinträge erzeugen
      miCurr = new MenuItem ();
      miCurr.Index = iIndex++;
      miCurr.Text = "&Aktion 1";           // Eigenen Text einsetzen
      miCurr.Click += new System.EventHandler (Action1Click);
      cm.MenuItems.Add (miCurr);

      // Kontextmenüeinträge erzeugen
      miCurr = new MenuItem ();
      miCurr.Index = iIndex++;
      miCurr.Text = "&Beenden";
      miCurr.Click += new System.EventHandler (ExitClick);
      cm.MenuItems.Add (miCurr);

      // NotifyIcon selbst erzeugen
      notico = new NotifyIcon ();
      notico.Icon = new Icon("smile.ico"); // Eigenes Icon einsetzen
      notico.Text = "Doppelklick mich!";   // Eigenen Text einsetzen
      notico.Visible = true;
      notico.ContextMenu = cm;
      notico.DoubleClick += new EventHandler (NotifyIconDoubleClick);

      // Ohne Appplication.Run geht es nicht
      Application.Run ();
   }

   //==========================================================================
   private static void ExitClick (Object sender, EventArgs e)
   {
      notico.Dispose ();
      Application.Exit ();
   }

   //==========================================================================
   private static void Action1Click (Object sender, EventArgs e)
   {
      // nur als Beispiel:
      // new MyForm ().Show ();
   }

   //==========================================================================
   private static void NotifyIconDoubleClick (Object sender, EventArgs e)
   {
      // Was immer du willst
   }
   
}
	}
}

nur Fehlermeldungen. Ich denke es liegt an der falschen Position des Timers, aber ich weiß nicht wo er hin muß. Kann mir jemand dabei helfen?

Wie gesagt, bin absoluter Neuling und versuche "learning by doing" =)

2.298 Beiträge seit 2010
vor 4 Jahren

Was erhältst du denn für Fehler? Nur "Ich erhalte Fehler" ist für keinen hilfreich.

Da ich es mir aber dennoch mal angesehen habe. Dein Code kann so halt einfach garnicht kompilieren. Du hast den Eventhandler t1_Tick mitten in die Main Methode gepackt.

Eigne dir am besten wenigstens die nötigsten Grundlagen an.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

N
Nierewa Themenstarter:in
15 Beiträge seit 2019
vor 4 Jahren

Ich erhalte insgesamt 37 Fehler, die ich nicht alle aufführen kann.

Dein Code kann so halt einfach garnicht kompilieren. Du hast den Eventhandler t1_Tick mitten in die Main Methode gepackt.

Könntest Du mir sagen wo das dann hinmuß und warum?

Ich weiß das es ohne Grundlagen nicht geht und es ist wohl auch ein Fehler gleich mit c# anzufangen wenn man noch nie programmiert hat. doch leider stehe ich unter Zeitdruck und habe nicht soviel Zeit 🙁

using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;



namespace Zuarbeit
{
    /// <summary>
    /// Class with program entry point.
    /// </summary>
    internal sealed class Program
    {
        /// <summary>
        /// Program entry point.
        /// </summary>  


//*****************************************************************************

void t1_Tick(object sender, EventArgs e)
            

{

	
        string fileName = "";
              string sourcePath = @"Z:\DHL\";
              string targetPath =  @"Z:\DHL\Versand\";

              // Use Path class to manipulate file and directory paths.
              string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
              string destFile = System.IO.Path.Combine(targetPath, fileName);

    foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {

                     // Eine Backupdatei von der Quelldatei anlegen
               fileName = System.IO.Path.GetFileNameWithoutExtension(fn);
               destFile = System.IO.Path.Combine(sourcePath, fileName+".bak");
               System.IO.File.Copy(fn, destFile, true);

               // in der Textdatei alle # mit | ersetzen.
               string text = File.ReadAllText(fn);
               text = text.Replace("#", "|");
               File.WriteAllText(fn, text);



               // die Datei in den Zielordner kopieren und danach löschen
               fileName = System.IO.Path.GetFileName(fn);
               destFile = System.IO.Path.Combine(targetPath, fileName);
               System.IO.File.Copy(fn, destFile, true);
               System.IO.File.Delete(fn);
              }
              }



static class MyNotifyIconApplication
{
   private static NotifyIcon  notico;
   


    //==========================================================================
   public static void Main (string [] astrArg)
   {

   Timer t1 = new Timer(); // Timer anlegen
   t1.Interval = 100; // Intervall festlegen, hier 100 ms
   t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
   t1.Start(); // Timer starten  

	


         ContextMenu cm;
      MenuItem    miCurr;
      int         iIndex = 0;

      // Kontextmenü erzeugen
      cm = new ContextMenu ();

      // Kontextmenüeinträge erzeugen
      miCurr = new MenuItem ();
      miCurr.Index = iIndex++;
      miCurr.Text = "&Aktion 1";           // Eigenen Text einsetzen
      miCurr.Click += new System.EventHandler (Action1Click);
      cm.MenuItems.Add (miCurr);

      // Kontextmenüeinträge erzeugen
      miCurr = new MenuItem ();
      miCurr.Index = iIndex++;
      miCurr.Text = "&Beenden";
      miCurr.Click += new System.EventHandler (ExitClick);
      cm.MenuItems.Add (miCurr);

      // NotifyIcon selbst erzeugen
      notico = new NotifyIcon ();
      notico.Icon = new Icon("smile.ico"); // Eigenes Icon einsetzen
      notico.Text = "Doppelklick mich!";   // Eigenen Text einsetzen
      notico.Visible = true;
      notico.ContextMenu = cm;
      notico.DoubleClick += new EventHandler (NotifyIconDoubleClick);

      // Ohne Appplication.Run geht es nicht
      Application.Run ();
   }

   //==========================================================================
   private static void ExitClick (Object sender, EventArgs e)
   {
      notico.Dispose ();
      Application.Exit ();
   }

   //==========================================================================
   private static void Action1Click (Object sender, EventArgs e)
   {
      // nur als Beispiel:
      // new MyForm ().Show ();
   }

   //==========================================================================
   private static void NotifyIconDoubleClick (Object sender, EventArgs e)
   {
      // Was immer du willst
   }


}
    }
}

So bekomme ich die Fehlermeldung:

Für das nicht statische Feld, die Methode oder die Eigenschaft 'Zuarbeit.Program.t1_Tick(object, System.EventArgs)' ist ein Objektverweis erforderlich. (CS0120) - \SharpDevelop Projects\Zuarbeit\Zuarbeit\Program.cs:76,13
2.298 Beiträge seit 2010
vor 4 Jahren

Hallo,

es ist absolut nichts falsch da dran direkt mit C# anzufangen. Man sollte sich allerdings anschauen, was man fabriziert und sofern Fehlermeldungen erscheinen auch mal selbst danach suchen.

Übrigens, du brauchst nicht ständig den Code der ganzen Program.cs hier posten. Der für den Fehler relevante Inhalt sollte ausreichen (wäre in dem Fall der EventHandler für Timer.Tick und die Main.

Warum der Eventhandler nun plötzlich Teil von der Klasse Programm und nicht mehr von der Klasse MyNotifyIconApplication ist erschließt sich mir ebenfalls nicht.

Vorschlag: Schieb den EventHandler zurück nach MyNotifyIconApplication und dann schau dir mal ganz genau die anderen EventHandler an.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

N
Nierewa Themenstarter:in
15 Beiträge seit 2019
vor 4 Jahren

Es sieht jetzt so aus und funktioniert:

static class MyNotifyIconApplication
{
   
private static void t1_Tick(object sender, EventArgs e)  
{
              string fileName = "";
             ...
              string destFile = System.IO.Path.Combine(targetPath, fileName);

    foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {

                   ...
              }
 }
   private static NotifyIcon  notico;
     //==========================================================================
   public static void Main (string [] astrArg)
   {

   Timer t1 = new Timer(); // Timer anlegen
   t1.Interval = 10000; // Intervall festlegen, hier 100 ms
   t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
   t1.Start(); // Timer starten

...

Ich hab die anderen Eventhandler angesehen, da stand immer private static ... auch hingeschrieben und es geht. Warum?

2.298 Beiträge seit 2010
vor 4 Jahren

Nun das liegt daran, dass alle Methoden und Eventhandler die aus einer statischen Methode heraus aufgerufen werden auch statisch sein müssen.

Das ist leider schon für die Main-Methode Zwangsläufig der Fall. In der Regel ist es sowieso besser, Funktionalitäten in eine eigene Klasse auszulagern nicht statisch auszuführen.

Sofern du dich weitergehend mit der Programmierung beschäftigen möchtest, solltest du dich daher erst einmal besser einlesen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

N
Nierewa Themenstarter:in
15 Beiträge seit 2019
vor 4 Jahren

Als nächsten Schritt wollte ich eine Konfiguratiosdatei benutzen. Der Nutzer soll den Quell- und Zielpfad selbst bestimmen können... ist das zu hoch für mich und Utopie?

Oder zeigt mir jemand wie es geht?

Das Formular dazu hab ich schon entsprechend erstellt...

3.170 Beiträge seit 2006
vor 4 Jahren

Hallo,

siehe auch [Tutorial] Konfigurationsmodell im .NET Framework

und beachte zukünftig [Hinweis] Wie poste ich richtig? Punkt 1.2

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

N
Nierewa Themenstarter:in
15 Beiträge seit 2019
vor 4 Jahren

Danke für die Links. Werd ich mich mal einlesen =)

@MarsStein:
Sorry, wenn ich weitere Fragen habe öfnne ich einen neuen Thread