Verstehe, dann solltest wie ich oben schon geschrieben habe eine Variable nehmen, die angibt, ob das Bild nun "bereit zum Speichern" ist oder nicht.
Evt. ließe sich auch mit "lock" arbeiten, kommt auf den Geschmack und das Beispiel drauf an.
Bei devtrain.de gibts einen (meiner Meinung nach) guten Artikel zum Thema lock und Threading: http://www.devtrain.de/artikel_790.aspx
Oder sonst lock-Anweisung bei MSDN: http://msdn2.microsoft.com/de-de/library/c5kehkcz(VS.80).aspx
Mfg Preli
PS: Vielleicht gäbs auch noch eine bessere Lösung, aber so würde ich es machen, wenn jemand noch weitere Ideen hat, dann nur raus damit.
Im Openbook wird meist Application.StartupPath benutzt.
Ich persönliche schreibe einfach nur die Datei ohne Pfadangabe, was jedoch nicht ganz so sauber ist denk ich, zumindest hat es bei mir schon mal zu Komplikationen geführt.
Ich denke StartupPath dürfte da nicht ganz so falsch sein, wenn es auch im Galileo Openbook steht.
Nun bekomme ich das Problem, dass manchmal in der PictureBox ein Bild dargestellt wird, was halb abgeschnitten ist.
Offensichtlich ist es so, das Thread1 noch das Bild in das Feld schreibt und Thread2 schon mit dem auslesen beginnt.
Nun wenn es wirklich daran liegt, solltest du in einer Variable speichern, wenn das Bild fertig ist und Thread2 darf dann erst mit dem Lesen beginnen.
Wenn diese Dinge hintereinander passieren stellt sich jedoch wieder die Frage wozu man dann überhaupt zwei Threads braucht und ob man das nicht in einem unterbekommt.
Also bei mir kann ich den Minimieren und den Maximieren Button auf False setzen und es funktioniert wie gewünscht. Merkwürdig.
Vielleicht hilft dir evt. die Eigenschaft FromBorderStyle des Forumlars weiter. Dort gibt es auch verschiedene "Rahmen", die bestimmte Einschränkungen was minimieren, maximieren und Größe verändern betreffen.
Möglicherweise weiß ja jemand anderer warum dieser Effekt bei dir auftritt.
Wenn das Fenster maximiert ist müsste es eigentlich auch am oberen Ende der Taskleiste aufhören.
Bist du sicher dass dein Fenster maximiert ist, oder hast du evt. du Größe "manuell" zu hoch eingestellt?
Ich dachte an Interfaces, aber weil ich ja aus der Baseform meine Methoden aufrufe, müsste ich das Interface ja auch wieder dort implementieren, was ja gerade keinen Sinn macht.
Nicht ganz. Du machst ein Interface welches du dann, wie du schon sagtest natürlich nicht in Baseform implementierst, sondern in der davon abgeleiteten Form.
Aber ich denke das beste ist wirklich einfach eine "leere" Funktion zu erstellen und evt. so wie JuyJuka schon erwähnte eine NotImplementedException zu werfen. Ist vielleicht nicht die sauberste Lösung, aber du würdest erreichen was du beabsichtigst.
Mfg Preli
Ach ja: dritte Möglichkeit:
Nachdem du alle Forms und Oberfläche mit dem Designer erstellt hast, kannst du die Funktionen ja abstract machen - dann brauchst du den Designer ja nicht.
Oder du arbeitest ganz ohne Designer
Ich kenne zwar das "Tobit Infocenter" nicht, aber meinst du mit Module sowas wie Plugins bzw. evt. könntest du es auf diese Weise lösen. Klingt für mich jetzt ähnlich - falls ich ganz daneben lieg korrigier mich.
Bei Codeproject -> http://www.codeproject.com/csharp/PluginsInCSharp.asp gibts ein gutes Beispiel zu Plugins. Reinschauen kostet ja nichts.
Mfg Preli
//edit: Ich denke ich bin gerade draufgekommen was du mit Module meinst. Ich denke dass es eigentlich viele "Module Handler" und Bibliotheken zu diesem Thema im Internet geben müsste.
Nun egal welche Methode aus der DLL ich aufrufe, es kommt immer diese Exception. Der genau gleiche Code funktioniert in XP jedoch tadellos.
Ich arbeit mit DllImport:
Ich hab bereits etliche Stunden im Internet verbracht, scheinbar gibt es einige andere, die das selbe oder ein ähnliches Problem haben. Ein allgemein gültiger Lösungsansatz, war jedoch noch nirgends zu finden und die Lösungen die dort standen, helfen bei mir nicht.
Ich kann bis jetzt unter Vista auf keine einzige "nicht .net DLL" zugreifen.
Schaut ja eh ganz gut aus. Nur dass du deine ArrayList eigentlich nicht benutzt, sprich in deinem Beispiel kannst du sie dir schenken.
Ich schätze du bist noch unzufrieden, weil du nur eine Zeile ausliest und nicht die ganze Datei.
//FileStream kannst dir auch schenken, einfach beim StreamReader den DateiPfad als Parameter angeben
StreamReader t = new StreamReader("Arbeiter.txt");
//Dann brauchst du eine Schleife
while (! t.EndOfStream)
{
string line;
line = t.ReadLine();
ListeBewerber.Items.Add(line);
}
f.Close();
Also soweit ich das verstanden habe, hast du in einer Textdatei UniCode Zeichen, die du auslesen möchtest und irgendwo anzeigen willst.
Hab ich das soweit richtig verstanden?
Dann musst du eigentlich nur die einzelnen Zeichen aus der Datei auslesen (zum Beispiel mit einem StreamReader) und dann irgendwie anzeigen (zum Beispiel in einer ListBox -> listbox.Items.Add(...); )
Die Idee hatte ich anfangs auch, nur soweit ich weiß würde Vista mich informieren, wenn ein Programm auf Registry etc. zugreifen möchte und ich (als Benutzer) könnte dann zustimmen oder auch nicht.
Außerdem greife ich in keiner der DLLs auf Registry noch auf C:\Windows oder C:\Programme zu.
Zusätzlich ist die AutoIt (eine der zwei Bibliotheken) offiziell mit Vista kompatibel.
Trotzdem glaube ich dass es evt. ein Konfigurationsproblem ist oder das Programm zu wenig Rechte besitzt. Nur wie könnte ich den Fehler beheben?
Mfg Preli
PS: Ich führe das Programm als Admin aus, falls das relevant ist
Folgendes Problem: Habe zwei DLL-Dateien, auf die ich zugreife, die eine ist SQLite (kennen wahrscheinlich viele) und die zweite ist AutoItX3.
Unter Windows XP funktioniert alles wie es soll, in Vista jedoch kommt eine AccessViolationException.
Du könntest auch einen Dienst dafür programmieren. Würde denk ich gut passen für dein Problem. Lies dich mal etwas in die Thematik ein, falls dir dieses Kapitel noch unbekannt ist. Da (zumindest einige) Computer so konfiguriert sind, dass "gewöhnliche Programme" gegenüber "Diensten" bevorzugt werden, wird der User nichts mitbekommen. Du könntest die Priorität für den ausführenden Thread auch selbst niedriger einstellen.
Für die zeitgesteuerten Aufgaben könnte man einen Timer benutzen. ACHTUNG allerdings: wenn du dich für einen Dienst entscheidest funktioniert der Standardtimer von Windows nicht. Gibt aber noch andere Timer, die serwohl funktionieren.
Original von Cookiie
Aber gut zu wissen, das ich jetzt mein Programm nicht zwangsoptimieren muss :-)
Hatte auch mal ein Programm mit vielen Stringoperationen, das ich dann optimiert habe. Also von String auf StringBuilder. Hat mich ca. 20 Stunden Arbeit gekostet um danach festzustellen, dass es ungefähr gleich schnell war wie zuvor.
Also Fall 1 und 2 sind gleichwertig was die Geschwindigkeit anbelangt. (edit: Davon abgesehen, dass Fall 2 vom Compiler nicht zugelassen wird. :D)
Fall 3 dürfte nach meiner Erfahrung sich NICHT auszahlen. Könnte man eigentlich ganz einfach ein Testprogramm machen und prüfen was länger dauert.
Hab auch mal viel Zeit in String Optimierung gesteckt und habe danach festgestellt, dass es sich in vielen Fällen NICHT auszahlt auf StringBuilder zu wechseln. (Außer natürlich wenn sehr, sehr viel verändert wird und der String selten ausgelesen wird)
Mfg Preli
//edit: Hab jetzt mal ein Testprogramm geschrieben (war selbst neugierig). Fall 1 ist ca. 30 Prozent schneller. Selbst in diesem Fall
Fall1:
Es gab schon mal so einen ähnlichen Thread (siehe hier Arbeiten mit strings beschleunigen ). Dort stelle ich ganz unten auch eine eigene Klasse von mir vor (StringBuilder), die in manchen Fällen sogar schneller als string sein kann.
Schau's dir mal an (am besten auch die Excel-Datei)
Tja ich bezweifle das du das Löschen einer Datei so richtig verhindern kannst, aber du kannst die Datei verschlüsseln, dann kann der Benutzer die Datei zumindest nicht lesen und somit auch nicht zu etwas sinnvollen verändern.
Im "normalen" Framework gibts da ganz einfach zu benutzende Klassen. Ob's die aber auch im CF gibt weiß ich leider nicht.
Einfach mal ein bisschen googeln.
Ich denke mal du meinst mit "SteamWrite Vorgang", dass du mit einem StreamWriter etwas in eine Textdatei schreibst. So würde ich zumindest vorgehen, wenn ich etwas in eine Textdatei schreiben wollte.
Wenn du mit dem Schreibvorgang fertig bist musst du nur den StreamWriter schließen. FERTIG.
Beispiel:
StreamWriter sw = new StreamWriter("myfile.txt");
sw.WriteLine(...);
//und nun schließen
sw.Close();
Danke für die Info.
Ich dachte mir schon, dass ich mit GetProcessesByName nicht weiterkomme.
Zu deiner Frage, das ganze sollte auf Vista laufen. (hätte ich vielleicht gleich sagen sollen)
Bin jetzt bei meinen Recherchen auf AutoIt gestoßen. Die neue Version3 kann mir da vielleicht weiterhelfen (möglicherweiße). Ich befürchte die Chance ist recht gering, dass jemand AutoIt in C# schon mal benutzt hat. Falls doch wäre ich über Hilfestellungen dankbar.
Für Java hab ich schon einiges gefunden, werd mal weitersuchen.
Ich müsste eine Funktion schreiben, mit der ich ermitteln kann, welche Explorer-Fenster gerade offen sind, sprich welche Ordner.
Ich bin bei meiner Suche schon auf kleine Code-Ausschnitte gestoßen, jedoch hat noch keiner so richtig zum Ziel geführt.
Hallo KirKone!
Wir überlegen gerade ob wir nicht doch etwas anderes programmieren sollen. Immerhin gibt es solche Programme wirklich schon haufenweise.
Wir sind aber immer noch am überlegen - sprich nix ist fix
Beim Projekt haben wir bis jetzt mal eine Art Pflichtenheft festgelegt und sind jetzt grad dabei ein Klassendiagramm des Grundgerüsts zu erstellen, bzw. andere grundlegende Dinge festzulegen.
Mfg Preli
PS: Dein Webeditor würde mich trotzdem interessieren. Würd ich gern mal ausprobieren.
Du könntest den Bug an Microsoft melden (ist ja wie du selbst geschrieben hast ne Beta Version). Egal wie Microsoft das ganze geplant hat, ich bin sicher, dass es nicht beabsichtigt ist, dass sich das VS "kommentarlos schließt".
Wie man das Problem umgehen könnte weiß ich aber leider auch nicht. sorry.
Es gäb noch zwei weitere Möglichkeiten, die mir eingefallen sind:
1.) einen Dienst im Hintergrund laufen lassen, der in regelmäßigen Abständen (z.B. alle 5 Minuten) prüft, ob die Zeit verändert wurde (sprich die Zeit wird alle 5 Minuten gespeichert, liegt die neue Zeit "hinter" der alten wurde geschummelt. Kann zwar auch umgangen werden, indem man den Dienst abstellt, aber da muss man erst mal draufkommen.
Wär natürlich nicht wirklich fair dem User gegenüber immer einen Dienst im Hintergrund laufen zu lassen.
2.) Was natürlich noch unkomfortabler wäre für den Nutzer: aktuelle Zeit nicht vom Computer ermitteln, sondern von einem Server im Internet abfragen, dann weiß man bestimmt das richtige Datum. Nachteil natürlich: Ohne Internetzugang funktioniert das Programm nicht und wenn der Server mal nicht funktioniert, geht auch nix. Außerdem wollen die meisten User kein Programm, welches nach Hause telefoniert.
Würde ich höchstens einsetzen, bei einem Programm, welches ohnehin das Internet benötigt, wie MailProgramme oder Messenger.
Original von DCoder
Oder du benutzt eine Kombination aus Datum in die Registry schreiben und Feststellen ob das Datum geändert wurde. Dazu könntest du beispielsweise bei jedem Programmstart das aktuelle Datum speichern und mit dem letzten vergleichen -- wenn das letzte in der Zukunft liegt hat der User die Zeit verstellt. (Das Speichern des Datums muss wiegesagt verschlüsselt geschehen, da man ja sonst das Programm ohne weiteres austricksen könnte ;-))
Ist aber auch nicht zu 100% sicher, da der Benutzer das Datum ja VOR jedem Programmstart zurückstellen könnte und zwar ungefähr 5 Minuten später als der letzte Programmstart war. Dann denkt das Programm es sind lediglich 5 Minuten vergangen, in wirklichkeit könnten aber Tage oder Wochen vergangen sein.
Da viele Demo-Programme so arbeiten ist es auch nicht wirklich unwahrscheinlich, dass der Benutzer das austesten wird.
TROTZDEM: wahrscheinlich immer noch eine der besten und sichersten Lösungen.
Original von Arthuro
Aber irgendwie wir die datei nicht geöffnet warum ?
Ich nehme mal an, dass die Datei geöffnet wird, aber du tuts ja nichts damit. Immerhin zeigt die Funktion OpenText nichts an, sondern liefert nur einen StreamReader zurück.
Schau dir mal Beispiel 2 auf folgender Seite an, da wird mit der Funktion OpenText gearbeitet: http://www.csharphelp.com/archives/archive24.html
Original von Himo
danke Balu, aber das Datum als bezug für den Trailinterwal ist doch keine geschickte Idee, weil der user das Datum von seinem System zuruckstellen kann
Stimmt genau, der User könnte das Datum zurückstellen, das kann man nicht wirklich verhindern.
Wenn dir das zu unsicher ist, gäbs da noch die Möglichkeit das der Benutzer das Programm zum Beispiel nur 30 mal Öffnen darf. Ist aber auch nicht das Gelbe vom Ei.
Zitat
Original von Himowie kann ich in C# auf das Registry zugreifen?
Ich hatte auch mal ein recht rechenintensives Programm geschrieben. Als ich die Compileroptionen umstellte (von Debug-Modus auf Release), hat sich die Geschwindigkeit um die 25% verbessert. Also in machen Fällen kanns schon hilfreich sein sich da etwas zu spielen. Dass man aber von 50% Auslastung auf 5% kommt - eher nicht. Aber vielleicht ein Schritt in die richtige Richtung.
DirectX ist evt. zu überlegen, da in diesem Fall die Grafikkarte besser einbezogen wird und somit der Prozessor geschont wird.
Wie Andavos bereits sagte, wird ein Thread beendet, wenn die Methode fertig ist, jedoch ist zu beachten, dass Thread-Methoden oft ungefähr so aussehen (findet man zumindest in einigen Tutorials und Büchern):
while(true) { ... }
Vor allem wenn irgendetwas ständig im Hintergrund durchgeführt werden soll. Kann oft zu Fehlern führen, da ein Thread NICHT automatisch beendet wird, wenn man den "Haupt-Thread" beendet. Kann dann oft zu Fehlern führen.
Ich weiß das war nicht direkt gefragt, aber das passt hier recht gut dazu und ist für die Praxis recht hilfreich. Ich hoffe ihr verzeiht mir.
Original von Heckenschere
edit2: HIHI habs endlich geschafft. Musste das dumme do weg machen. aber ich versteh irgendwie nich warum bei wiki da do steht und es mit do garnich funzt
Das liegt daran, dass bei wikipedia pseudocode steht und nicht C#-Code
Vielleicht hilft dir das zu verstehen warum: Eine while schleife führt immer die die danach folgende Anweisung aus. Mit einem { } auch mehrere. In deinem Fall hast du (wieder mal) eine tolle Endlosschleife, weil die Schleife eines macht nämlich nichts -> " ;"