Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Schleife nach bestimmter Zeit erneut ausführen
Nierewa
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

Schleife nach bestimmter Zeit erneut ausführen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2340

beantworten | zitieren | melden

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 | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Nierewa
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

beantworten | zitieren | melden

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" =)
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2340

beantworten | zitieren | melden

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 | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Nierewa
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

beantworten | zitieren | melden

Ich erhalte insgesamt 37 Fehler, die ich nicht alle aufführen kann.
Zitat
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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Nierewa am .
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2340

beantworten | zitieren | melden

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 | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Nierewa
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2340

beantworten | zitieren | melden

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 | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Nierewa
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
hypersurf
myCSharp.de - Member



Dabei seit:
Beiträge: 511
Herkunft: Münster

beantworten | zitieren | melden

Unzählige Tutorials (und jedes Anfängerbuch) zeigen Dir wie das geht:
https://www.codeproject.com/Articles/17659/How-To-Use-the-Settings-Class-in-Chttp://openbook.rheinwerk-verlag.de/visual_csharp_2010/visual_csharp_2010_15_003.htm#mj8d0d17d2198f2ee0c46fb59f65e85b07
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3429
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Nierewa
myCSharp.de - Member



Dabei seit:
Beiträge: 15

Themenstarter:

beantworten | zitieren | melden

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

@MarsStein:
Sorry, wenn ich weitere Fragen habe öfnne ich einen neuen Thread
private Nachricht | Beiträge des Benutzers