X
@DocShoe
Nochmals danke für die Hinweise das mit Stil und der gegebene Link hat viel geholfen, wahrscheinlich sind in den Codes immer noch einige Stil Fehler drin aber wie gesagt bin Anfänger und solche Sachen brauchen Zeit damit ich es mir gewöhne.
Zu dem Code:
Hab jetzt deinen Ratschlag verfolgt und mir einen Schema aufgebaut wie der Programm ungefähr (weil mit jede neu Erkennung kommen immer neue Ideen drauf) aussehen soll. Ich weiß dass man es vielleicht viel anders Codieren kann. Aber mit selbst Beigebrachtes in 3 Wochen bin ich aktuell nur so weit
Hab jetzt den Kompletten Programm auf 4 Bereiche aufgeteilt:
1. Main Programm
using System;
using System.Globalization;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Test
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Excellesen Excellesen = new Excellesen();
Excellesen.Read();
Simulation Simulation = new Simulation();
Simulation.Ausführen();
return;
}
}
}
Hier wird die einzelne abhängige Threads gestartet. (Nur eine frage gibt es eine Möglichkeit das bei einem neue Thread auch neue Fenster geöffnet wird?) Hier fehlen noch 2 Threads die ich noch einfügen will.
eine Abfrage Funktion die die Werte aus Excellesen mit Simulation vergleicht und je nach Vorgabe dann auf dem Screen ausliest
Grafische Oberfläche (das dauert )
2. Excellesen (Diese Thread ist nur für die Präsentation der Programm an die Management gedacht, später wird diese Thread mit einem Datenbank Server ersetzt)
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.Linq.Expressions;
using System.Threading;
namespace Test
{
public class Excellesen
{
[STAThread]
public static void Main(string[] args)
{
Thread Excellesen = new Thread(new ThreadStart(Read));
Excellesen.Start();
}
public static void Read()
{
Application app = new Application();
Workbook book = null;
Worksheet sheet = null;
Range range = null;
try
{
DateTime startTime = DateTime.Now;
app.Visible = false;
app.ScreenUpdating = false;
app.DisplayAlerts = false;
string exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
book = app.Workbooks.Open(exePath + @"\Produktion.xlsx", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
sheet = (Worksheet)book.Worksheets[1];
range = sheet.get_Range("A1", Missing.Value);
range = range.get_End(XlDirection.xlToRight);
range = range.get_End(XlDirection.xlDown);
string downAddress = range.get_Address(false, false, XlReferenceStyle.xlA1, Type.Missing, Type.Missing);
range = sheet.get_Range("A1", downAddress);
object[,] values = (object[,])range.Value2;
Console.WriteLine("Col Count: " + values.GetLength(1).ToString());
Console.WriteLine("Row Count: " + values.GetLength(0).ToString());
Console.Write("\t");
for (int j = 1; j <= values.GetLength(1); j++)
{
Console.Write("{0}\t", j);
}
Console.WriteLine();
for (int i = 1; i <= values.GetLength(0); i++)
{
Console.Write("{0}\t", i);
for (int j = 1; j <= values.GetLength(1); j++)
{
Console.Write("{0}\t", values[i, j]);
}
Console.WriteLine();
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
finally
{
range = null;
sheet = null;
if (book != null)
book.Close(false, Missing.Value, Missing.Value);
book = null;
if (app != null)
app.Quit();
app = null;
}
}
}
}
Hier soll eine dauerhafte Verbindung zu Excel Datei bestehen die dann bei Änderungen sich anpasst daher wäre es sinnvoll hier einen While Funktion einzubauen? oder würde es zu viel Arbeitsspeicher wegnehmen und zum Programmsturtz führen??
Der Thread soll komplett im Hintergrund laufen (aktuelle Code tut es teilweise) der Soll keine Werte anzeigen sondern die werte Speichern damit beim Abfrage Funktion (der noch in Main Programm kommt) die werte nach Spalten auslesbar sind.
3. Simulation (Das gleiche wie bei Excellesen Thread, hat diese Thread nur einen Wert für die Präsentation es wird später über Netzwerkverbindung zu Produktion oder SAP verbunden werden)
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
namespace Test
{
public class Simulation
{
[STAThread]
public static void Main(string[] args)
{
Thread Simulation = new Thread(new ThreadStart(Ausführen));
Simulation.Start();
}
public static void Ausführen()
{
Thread Produktion = new Thread(new ThreadStart(Test));
Console.WriteLine("**Simulation**");
Console.WriteLine();
string Material;
Console.Write("Bitte Material für Simulation Eingeben: " );
Material = Console.ReadLine();
Console.WriteLine();
Produktion.Start();
/*string Material()
{
Console.Write("Bitte für Simulation Materialnummer Eingeben: ");
return Console.ReadLine();
}*/
string Bestand()
{
Console.Write("Bitte für Simulation Bestand Eingeben: ");
return Console.ReadLine();
}
void Test()
{
Console.WriteLine("****** Produktion startet ******");
int i;
Int32.TryParse(Bestand(), out i);
for (; i > 0;)
{
Console.Write("Produktion Bestand ");
Console.Write(i);
do
{
Console.WriteLine("Neue Bestand " + --i);
Thread.Sleep(5000);
}
while (i > 0);
}
Console.ReadKey();
}
}
}
}
Habe es jetzt hinbekommen das er den Bestandswert was ich für Präsentation eingebe in den While Funktion mitnimmt. (Zeile 55)
Wäre es hier sinnvoll den i wert was im Zeile 63 ausgibt in einen String zu speichern. Damit der Abfrage Thread von Main Programm die Werte von Excellesen Thread und Simulations Thread(i Wert) dauerhaft vergleichen kann und bei einem Bestimmte Vorgabe dann eine Meldung gibt.
Meine Aktuelle Codierung sieht so aus, wie gesagt natürlich hättet ihr Profis das eventuell anders codiert aber mit meiner Aktuellen Wissensstand war das beste was ich codieren konnte