Ja, die Sache mit den Regions ist mir schon bekannt - nur um mal eben was wegen der "besseren" Übersicht mit Regions zu falten, finde ich schon was aufwändig.
Da das ja auch wieder nur zusätzlicher Code ist, wirds dann in der nicht gefallteten Version nur noch unübersichtlicher...
für Schleifen wie z.B. FOR oder für Abfrage wie z.B. IF wären solche automatische Falten schon sinnvoll, denn diese besitzten ja einen definierten Anfangs- und Endpunkt ( meist "{" + "}").
Genau das meine ich...
Zitat von tonka
In VS gibts die Falten ja standardmäßig nur bei Methoden und Klassen(soweit ich weiß).
do <-Code-Falte beginnt
{
if (!fStopThread) <-Code-Falte beginnt....
{
String line;
line = sr.ReadLine();
if (line.Contains(suchstring))
{
for (int j = 0; j < zuLesendeZeilen; ++j)
{
//if (line.Contains(suchstring) && j ≥ 0)
//{
// if (j == 1)
// {
// j = 0;
// }
// else
// {
// j = 1;
// }
//}
w.WriteLine(line);
line = sr.ReadLine();
}
w.WriteLine(line);
w.WriteLine("");
}
} <-Code-Falte endet
else
{
return;
}
}
while (!sr.EndOfStream); <-Code-Falte endet
Das gibt natürlich sehr viele Code-Faltungen - aber vielleicht gibts ja etwas, dass innerhalb der Methoden die nächsten zwei oder drei Ebenen falten kann...
ich habe schon ein paar mal nach einer Funktion gesucht, die es mir ermöglicht sowohl Kommentare als auch Schleifen etc. mit Code-Falten zu versehen. Ich hab nicht unbedingt Lust an allen möglichen Stellen, regions einzufügen.
Ich hab schon mal das Addin SmartOutline ausprobiert, aber es ist nicht das, was ich Suche. Ich kann da zwar Regions einfügen, aber das ist mir in der Form zu umständlich...
Deine GUI hängt weil der Thread in dem moemnt auf die Antwort des Webservers wartet. Pack das ganze am besten in einen eigenen Thread oder in einen Background Worker dann hast du das Problem nicht mehr.
Ja das hab ich mir schon gedacht. Allerdings wollte ich das Threading in meinem Projekt sowieso nochmal komplett überarbeiten.
Hmm, hab das Visual Studio nochmal neu gestartet - komischerweise kommt da auch keine mehr... Aber der Check schlägt fehl - keine Updates vorhanden, obwohl eines drauf ist...
Und irgendwie hängt die Applikation kurz, sobald der Check läuft...
@Zony, danke für den Code - hat mir weitergeholfen
@EvilMM, ja, ich hab die alte verwendet - hatte nicht mehr geschaut, ob da eine neue DLL dabei war...
Allerdings bin ich nach einigem Rumprobieren immer noch nicht weiter. Bei mir schlägt der Check() auf neue Updates mit eine NullReferenceException fehl. Das einzige was in meinem Objekt aber "null" ist, sind die AuthorizationValues.
Was muss ich denn da reinschreiben? Hier mal mein Code:
//Parametriesierter Start eines Threads
//StartReading ist die Methode die im neuen Thread ausgeführt wird,
//dateien ist das Objekt, dass an die Methode übergeben wird
new Thread(StartReading).Start(dateien);
Wie gesagt: Lieber den ThreadPool verwenden!
Das mit dem Parametrisierten Thread gefällt mir auch nicht so. Siehe mein Edit weiter oben
genau damit hab ich mich in der letzten Zeit auch beschäftigt. Neben den Turotials hier findest Du auch beim Codeproject eine ziemlich umfrangreiche Einleitung zu Threads und co... Thread-Tutorial auf CodeProject
Ich hab das bei mir wie folgt gelöst. In meinem Form wähle ich Dateien aus die verarbeitet werden sollen. Die Verarbeitung beginnt nach einem Klick auf "Start":
(Der Code funktioniert so natürlich nicht, da ich fast alles rausgeschmissen hab, was fürs Threading unwesentlich ist)
private void StartButton_Click(object sender, EventArgs e)
{
progressBarMarquee.Style = ProgressBarStyle.Marquee;
progressBarMarquee.MarqueeAnimationSpeed = 1;
progressBarFiles.Style = ProgressBarStyle.Continuous;
progressBarFiles.Minimum = 0;
progressBarFiles.Maximum = completeSize;
progressBarFiles.Value = 0;
//Parametriesierter Start eines Threads
//StartReading ist die Methode die im neuen Thread ausgeführt wird,
//dateien ist das Objekt, dass an die Methode übergeben wird
new Thread(StartReading).Start(dateien);
}
...
// Methode, die im Thread ausgeführt wird.
private void StartReading(object container)
{
// Ich hab hier jeweils Quell- und Zieldatei in einem Dictionary gespeichert.
Dictionary<string, string> temp = new Dictionary<string, string>();
temp = (Dictionary<string, string>)container;
foreach (KeyValuePair<string, string> pair in temp)
{
try
{
string ziel = pair.Value;
string quelle = pair.Key;
do
{
// Wenn die Anwendung während der Bearbeitung des Threads gschlossen
// wird, verlasse ich mit RETURN den Thread
if (!fStopThread)
{
//macht was mit den Dateien
String line;
line = sr.ReadLine();
}
else
{
return;
}
}
while (!sr.EndOfStream);
// Hier wird die ProgressBar in Deiner MainForm aktualiesiert
//Invoke deshalb, weil direkte Zugriffe auf Teile der Form von einem anderen
//Thread aus nicht zulässig sind
// ChangeProgressFiles ist dabei die Methode, die die Änderung durchführt
this.Invoke(new MethodInvoker(ChangeProgressFiles));
}
}
}
private void ChangeProgressFiles()
{
progressBarFiles.Value += Convert.ToInt32(countSize);
}
--Edit--
Was ich leider noch nicht rausgefunden habe ist, wie ich benannte Threads mit Parametern starten kann. Das würde das kontrollierte beenden der Anwendung deutlich sicherer machen. Ob das nämlich mit meinem boolschen Wer so funktioniert, kann ich nicht sagen.
Vor der Einfügung ging das Beenden mal mit, mal ohne Exception.
Bei den "Internet-Informationsdiensten" sollte das zu finden sein. Da ich hier keinen IIS installiert habe, kann ich Dir leider nicht sagen, welcher Reiter das ist, aber es sollte schnell zu finden sein.
Deine virtuellen Verzeichnisse findest Du in der Regel in der Standardwebseite...
Falls Du mal rausfinden willst, warum Deine Schleife nicht funktioniert - verlager mal das "line = sr.ReadLine()" vor die selbige - vielleicht siehst Du dann ja, was da passiert...
(Ich will den Beitrag jetzt nicht nochmal editieren, daher noch eine Ergänzung...)
do
{
String line;
line = sr.ReadLine();
if (line == null)
{
break;
}
... Der Rest Deines Code - ohne 'break' und ohne 'sr.Close()'
}
while (!sr.EndOfStream);
Wenn der Stream also von vornherein leer ist, wird die Schleife sofrot abgebrochen - ansonsten wird Dein Code ausgeführt.
Das sr.close() solltest Du dann aber unterlassen, sonst passt Deine Abbruchbedingung nicht mehr (sag ich jetzt ohne das ausprobiert zu haben).
Das break solltest Du ebenfalls in Deiner if-else-Verzweigung weglassen, falls Du mehrere IP-Adressen hinzufügen willst.
Wenn Du aber immer nur eine IP hinzufügen willst, dann brauchst Du aber nicht wirklich die Schleife. Dann reicht Dein Code...
Ich kann da auf anhieb auch keinen Fehler feststellen. Probier doch statt dessen mal ein Do-While-Schleife. Da wird der erste Schleifenduchgang ja auf jeden Fall durchlaufen.
Dann kannst Du im Debugger auch wenigstens mal vernünftig sehen, welche Werte in Deine Variable geschrieben werden.
Zitat von JasonDelife
Doch, wegen des breaks und sr.Close() in if und else.
Er sagt doch, dass if und else gar nicht ausgeführt wird! Ausserdem hat er ja schon seinen Wert aus dem StreamReader in eine Variable geschrieben. Von daher macht das sr.Close() ja keinen Unsinn...
Ich würde da einfach eine Ladeanimation und einen Text "Bitte warten" anzeigen, solange der Vorgang läuft.
Ich hab mir nochmal die ProgressBar-Klasse angesehen und das "Marquee-Design" für mich entdeckt. Nachdem ich das mal schnell ausprobier habe, ist die Geschwindigkeit um etwa den Faktor 20 höher... Die Rechnerei hab ich aber auch wahrscheinlich etwas "dümmlich" realisiert ;)
Zitat von herbivore
die Verwendung eines Timers hat auf jeden Fall den Vorteil, dass die Berechnung garantiert ausreichend selten durchgeführt werden.
Ja, das war auch der Grund weshalb ich darüber nachgedacht habe. Aber im das Problem mit den Ausgangswerten hab ich damit noch nicht so ganz gelöst...
Ausserdem habe ich im Moment damit Probleme, das Timer-Event der Form-Klasse aus dem Thread heraus aufzurufen.
Deshalb bin ich bei den Marquee-Design der Progress-Bar gelandet. Für den Zweck reicht es allemal...
Zitat von tiger200
wenn es sich tatsächlich um dateiEN handelt, könntest du einfach die dateianzahl in die processbar reinschreiben und beispielsweise mit der dateigröße gewichten.
Es handelt sich tatsächlich um Dateien, aber die Abarbeitung erfolgt "manuell" nacheinander. Sind ja nicht grad hunderte. So um die 10 werden es maximal mal sein... Aber wenn es mehr werden, dann macht es durchaus Sinn. Dann aber mit doppelter ProgressBar ;)
ich bin gerade dabei ein kleines Progrämmchen zu basteln, dass mir aus Text-Dateien einen String heraussuchen und die betreffende Zeile sowie die X folgenden in eine neue Datei kopieren soll.
Zuerst hab ich das Programm ohne Threading geschrieben und das hat auch soweit funktioniert. Nur blockiert verständlicherweise die GUI, da die Dateien teilweise 2 Millionen (ja, 2 Millionen) Zeilen haben. (Im Prinzip ein "Log-File-Analysator", in dem dann nach Verbindungsabbrüchen gesucht wird.)
Jetzt möchte ich aber ein ProgressBar einbauen, da die Bearbeitung doch recht lange dauern kann - abhängig davon wie oft der Suchstring gefunden wurde.
Mein Problem ist jetzt folgendes:
Die ProgressBar akzeptiert als Grenzwerte nur Int32. Wenn ich nun die Zeichen der Datei über FileInfo auslese, bin ich da locker ausserhalb des Wertebreiches. Um das zu verhindern mache ich derzeit folgendes (nur die meiner Ansicht nach wesentlichen Elemente):
Könnt Ihr mir einen Tipp zu einem Lösungsansatz geben, wie ich das Füllen der ProgressBar vernünftig hinbekomme? Der Zeitaufwand für das Auslesen und Kopieren hat sich durch die ganze Rechnerei nämlich ziemlich deutlich erhöht...
Ich selbst habe schon über folgende Dinge nachgedacht:
Ermittlung, wie lange der Vorgang dauern wird und dann entsprechend die ProgressBar füllen (falls das irgendwie möglich sein sollte, was ich aber bezweifle).
Mit Timern arbeiten und alle 100ms den Stand (bearbeitete Zeichen) abfragen und die ProgressBar füllen.
Letztere Variante wäre für mich auch ohne Hilfe zu realisieren. Trotzdem würde ich gerne wissen, wie Ihr vorgehen würdet.
ausserdem solltest Du beachten, dass Telefonnummern nach internationalem Standard (ITU) inklusive Landesvorwahl maximal 15 Stellen lang sein dürfen. Wikipedia
Also: 0049 - 123 - 12345678
Selbst wenn Du die ersten beiden Nullen weglässt bist Du immer noch nicht im speicherbaren Zahlenraum des int32 (4294967295).
Von daher bleibt Dir, wenn Du die Rufnummern korrekt abspeichern willst, nichts anderes übrig, als Strings zu verwenden.
Wenn Du mit einer Datenbank arbeitest, dann würde ich evtl. überlegen, ob ich nicht für die Landesvorwahl, die Ortsvorwahl und die Durchwahl ein eigenes Feld reservieren würde. Aber das ist Ansichtssache...
Erst mal Danke für Eure Antworten! Mittlerweile war ich beim Kunden und die Datei System.Security.dll ist vorhanden. (Betriebssystem ist übrigens Windows Server 2003 R2)
Nachdem ich das Framework neu installiert (eher repariert) habe, bekomme ich aber immer noch die gleiche Fehlermeldung.
Der Witz ist, dass auf einem Windows XP System, mit Framework (Redist) und OPC-Core-Komponenten alles sofort und auf Anhieb funktioniert. Mein Programm scheint also richtig zu funktionieren.
Trotzdem finde ich dieses Verhalten nach wie vor eigenartig.
ich hoffe ich bin mit meinem Problem im richtigen Foren-Bereich gelandet.
Seit kurzem produziert eine von mir geschriebene Anwendung folgenden Fehler (basiert auf .NET 2.0):
Zitat
System.Security.Cryptography.CryptographicException: Das System kann die angegebene Datei nicht finden.
Ich selbst verwende diese Bibliothek jedoch gar nicht, aber eine DLL verweist darauf, soweit ich den Reflector da richtig verstanden habe.
Das Problem ist nun, dass seit der Installation alles eigentlich einwandfrei funktioniert hat. Seit ein paar Tagen lässt sich das Programm aber nicht mehr starten und gibt stattdessen ins Log die oben genannte Fehlermeldung aus.
Da ich selbst bisher nicht bei meinem Kunden vor Ort war, muss ich mich auf die Aussagen meiner Kollegen verlassen und glauben, dass am betreffenden Rechner NICHTS verändert worden ist.
Daher frage ich mich, woher der Fehler kommen kann. Ist es möglich, dass da irgendwas mit der Registrierung des .NET-Freamworks nicht mehr in Ordnung ist? Kann sowas überhaupt so mir nichts dir nichts passieren?
Ich hoffe Ihr könnt mir einen Tipp geben, in welcher Richtung ich suchen soll. Falls bis Montag noch keiner geantwortet hat, werde ich auf jeden Fall mal versuchen, die Runtime des .NET-Frameworks neu zu installieren.
verwendetes Datenbanksystem: <MS SQL (Desktop Engine), MS SQL Server Express 2008>
Hallo zusammen,
vor einiger Zeit habe ich mal angefangen ein kleines Tool zu schreiben, dass ein Datenbankbackup wiederherstellen sollte, hab es allerdings aus Zeitgründen wieder aufgegeben und den Quelltext auch nicht mehr.
Folgendes Szenario gilt:
Auf dem Server liegt sowohl die Datenbank, als auch in einem separatem Verzeichnis das Backup
Das Backup soll in eine neue Datenbank wiederhergestellt werden
Das Restore wird von meinem Tool von einem anderen PC (Client) aus gestartet
Folgendes Problem hatte ich damals:
Ich habe die Konfiguration auf dem Client in einer XML-Datei gespeichert. Als ich jedoch den Speicherordner des Backups mit aufnehmen wollte, bin ich daran gescheitert, den Backup-Ordner, der sich von Installation zu Installation unterscheiden kann auf dem Server über einen Konfigurationsdialog auszuwählen. Es ist an den Berechtigungen gescheitert. Ich hatte nie einem Möglichkeit gefunden, die Netzwerkberechtigungen entsprechend zu übertragen, ohne, dass der gleiche User auf dem Client eingerichtet werden musste.
Nun die Konzeptfrage:
Kann ich überhaupt die Datenbank wiederherstellen, wenn die Konfigurationsdaten, inkl. Ordnerangaben, durch den Client ausgewählt werden sollen?
Muss ich ein Client-Server-Modell dafür entwickeln?
Kann ich die Netzwerkanmeldung automatisiert durch mein Programm erledigen lassen?
mittlerweile hab ich einen Thread gefunden der unter Umständen für mich einen Lösungsansatz beinhalten könnte: mehrere Programminstanzen verhindern?
Die Frage die sich mir jetzt nur noch stellt ist, ob man über ein Mutex auch realisieren kann, dass ein OPC-Client auf eine bestehende Server-Instanz zugreift. Auch, wenn noch kein anderer OPC-Client mit diesem verbunden ist.
Edit: Ich sollte vielleicht noch anmerken, dass die Server-Client-Verbindung über COM/DCOM aufgebaut wird.
Das was ich aber eigentlich wollte, habe ich nicht damit hinbekommen.
Ich muss folgendes machen:
1. Ein OPC-Client verbindet sich mit dem Server
2. Der OPC-Server wird durch den Client gestartet.
3. Der Client verliert (warum auch immer, z.B. Neustart der Client-Anwendung) die Verbindung
4. Der Server wird NICHT beendet
5. Der OPC-Client verbindet sich mit der bestehenden Instanz des Servers.