Laden...

Forenbeiträge von MS Master Ingesamt 132 Beiträge

14.07.2010 - 23:52 Uhr

Hi,

naja verwendet wird Sie ja schon, Sie wird ja angezeigt 🙂

Was mich eben wundert ist das man weder den Text noch den Zustand etc. eines Buttons oder ähnlichem ändern darf, weil das Threadübergreifend ist und daher "verboten", gleichzeitig darf man aber wohl die Grafik eines Buttons von einem anderen Thread aus ändern.

Habe mal ein wenig rum gespielt, macht zwar keinen Sinn, aber so kann man z.b. eine "Lichtorgel" bauen.

Nach allem was ich aber bisher über das Thema Threads gelesen habe dürfte es gar nicht zulässig sein. Deswegen hat es mich ja gewundert das es zu keiner Exception kommt an dieser stelle, sondern es entgegen allem bisher bekannten "fehlerfrei" läuft 🤔

14.07.2010 - 18:56 Uhr

Hi all,

gleich zu Anfang, ja ich weiß was "delegate" ist und wie man es benutzt. 😉

Mir ist eher was anderes "seltsames" in diesem zusammen Hang aufgefallen für das ich bisher keine Erklärung gefunden habe.


this.button1.Text = "Hier kommt ein Text";

geht nicht, das ist soweit auch bekannt und wird brav "umgangen", das passt soweit alles.

Jetzt ist mir aber durch Zufall folgender Aufruf in einen Thread gerutscht beim um kopieren von Code


this.button1.Image = xxx.Properties.Resources.Bild;

Entgegen der Erwartung das es jetzt knallen würde wegen eines "unerlaubten" Threadübergreifenden Zugriffes wird das ändern der Grafik aber anstandslos ausgeführt. 🤔

Kann das mal einer Erklären 8o

20.12.2009 - 15:42 Uhr

@herbivore

Danke für den Hinweis. Deswegen hatte ich ja dazu geschrieben, das ich weiß wie man verhindert das mehrere Instanzen geöffnet werden, um dadurch darauf hinzuweisen, das ich durchaus zuerst in der FAQ geschaut hatte 😉

Der passende "Trick" steht aber erst wesentlich tiefer versteckt, aber ich denke ich habe da jetzt was passendes gefunden (auch wenn es wohl aufwendiger ist als zuerst gedacht).

@FZelle

Scheinbar hätte das von dir angesprochene "WindowsFormsApplicationBase" eine passende Funktion dafür (IsSingleInstance), aber leider findet sich dazu keine wirklich brauchbare Doku über die genaue Verwendung/Schreibweise. VS 2008 ist das ganze scheinbar "unbekannt".

Hast du das schon mal verwendet?

19.12.2009 - 17:51 Uhr

Hi all,

wie man verhindert das ein Programm doppelt gestartet wird weiß ich.

Nun hätte ich aber nicht einfach nur das nichts passiert oder eine Fehlermeldung kommt.

Sondern: Sollte ich das Programm nochmals starten, soll die bereits laufende Instanz in den Vordergrund geholt werden (meist befindet sich diese im Systray).

Hat da jemand einen Tipp wie man so was bewerkstelligen kann.

20.01.2008 - 19:34 Uhr

Sorry, das sollte keine Kritik an dir sein, sondern an mir.

Ich bin froh das ihr euch so geduldig mit mir befasst habt 👍, aber leider verstehe ich das ganze trotzdem nicht X(. Vielleicht bin ich einfach nur zu blöde dazu.

Und da helfen mir leider auch 1.000 Codebeispiele, gleich welcher art irgendwann nicht, wenn ich das WIESO und WARUM dahinter einfach nicht begeife.

Ich versuche soviel wie möglich bei anderen Fragen mitzulesen, um aus dortigen Antworten was zu lernen, aber schon bei den Delegates war ich fast am verzweifeln.

Gut, nach einigen Tagen und vielen vielen Stunden probieren habe ich es dann hinbekommen, und es funktioniert seither auch ganz gut bzw. ich habe das schon recht oft erfolgreich verwenden können.

Aber für Events bin ich wohl doch noch zu "dumm". Bzw. nach Heute habe ich es zumindest innerhalb von Form1 hinbekommen, und dafür sage ich gerne nochmal Danke.

Aber wie gesagt, ist keine Kritik an dir bzw. euch, sondern Kritik an mir, das ich es einfach nicht verstehen kann. Habe da wohl eine Lernschwäche....

Ich werde jetzt erst mal alles in Form1 rein werfen, dann funktioniert das für den Moment, und mal sehen, evtl lerne ich das zu einem späteren Zeitpunkt nochmal, und kapiere es dann auch wirklich.

20.01.2008 - 18:55 Uhr

Ich kapiere es einfach nicht. X(

Lass es einfach gut sein, ich verzichte dann wohl darauf das jemals zu erlernen.

Mehr als Bücher lesen hilft da leider auch nicht.

Und die Beispiele in den Büchern sind alle so angelegt, das ALLES in Form1 drinnen ist, aber eigentlich nie in anderen Klassen.

Und wenn dann doch mal andere Klassen kommen, sind die immer nur als static deklariert, wodurch von überall her zu griff besteht.

Ich habe hier 7 Bücher, mit fast 10.000 Seiten, aber Klassen übergreifende Events sind da schlicht keine drinnen. In 5 der Büchern sind nicht mal Threat übergreifende drinnen 🙄

20.01.2008 - 18:27 Uhr

Ok,

habe das nun "geteilt", aber wirklich weiter bin ich nicht.


Konfiguration Config = new Konfiguration();
Config.MeinEvent += new MyHandler(Ausgabe);
Config.MacheIrgendwas();

Das geht, wenn ich das ganze z.b. unter "InitializeComponent();" packe.

Aber von nirgendwo sonst kann ich das "Config.MacheIrgendwas();" aufrufen, es ist schlicht nirgends vorhanden. Also auch an anderen Stellen in Form 1, ich kann es schlicht nicht auswählen.

Ich bekomme echt noch die Krise X(

20.01.2008 - 17:57 Uhr

@Golo

Erst mal danke, das habe ich schon hinbekommen.

Ich klicke und das Event wird ausgelöst, das passt soweit.

20.01.2008 - 17:32 Uhr

Und schon währen wir wieder am Anfang, ich kapiere jetzt überhaupt nicht mehr, WAS eigentlich WO hin muss, und wer WAS WIE aufrufen kann/darf/muss.

Zum teil habe ich verstanden, welche "Teile" ich brauche um einen Event überhaupt schon mal in einer Klasse zu erzeugen und auszulösen.

Aber was ich brauche um das von einer anderen Klasse aus anzusprechen, da stehe ich jetzt ehrlich gesagt "wie der Ochs vorm Berg".

Sorry, ich verstehe es einfach nicht X(

20.01.2008 - 17:06 Uhr

Hallo herbivore

habe das mal durchgearbeitet.

Soweit scheint das zu funktionieren.

Aber....

Wie kann ich auf das Event aus einer anderen Klasse her zugreifen, oder wie muss es dort registriert werden.

Ich habe den Event jetzt in meiner Klasse "Form1", und jetzt soll dieser Event von "außerhalb", nämlich aus einer anderen Klasse heraus ausgelöst werden.

Um bei dem Beispiel mit dem "DoSomething ();" zu bleiben. Wie kann ich dieses aus anderen Klassen heraus aufrufen.

Den so wie im Beispiel das

Test test = new Test ();

geht ja nicht, da ich das ganze ja in der Klasse Form1 haben muss, wenn ich auf Form1 Elemente zu griff haben will.

20.01.2008 - 16:20 Uhr

Hallo Golo,

das habe ich soweit schon verstanden.

Wo ich aber hänge ist, das "wie wird es umgesetzt".

Also nur mal als Beispiel, ich klicke auf einen Button, dann macht er ja was, und jetzt möchte ich hier, der Einfachheit halber, das Event "Manuell" auslösen, nur um es zu verstehen.

Ich habe also:


private void button_Click(object sender, EventArgs e)
{
    AuszulösenderEvent("Hallo");
}

Wie müsste jetzt der delegate bzw. der event aussehen, damit beim Klick auf den Button das Event ausgelöst wird, und eine MessageBox aufpoppt mit dem Inhalt "Hallo".

20.01.2008 - 15:48 Uhr

Hi all,

ich hänge mich mal mit dran, da ich genau das gleiche Problem habe.

Ich habe jetzt schon 7 Bücher gelesen, und hunderte von beispielen gesehen.

Aber dennoch verstehe ich nicht WAS ich WOFÜR brauche.

Die Beispiele sind eigentlich alle immer schon so extrem Komplex, das ich nicht mehr verstehe WAS eigentlich WOFÜR benutzt wird.

Im Grunde scheitert es ja schon am Anfang.

Ich hatte schon mit Delegate einige Probleme, bis ich das verstanden habe, aber bei Events blicke ich überhaupt nicht mehr durch im Moment.

Fast alle beispiele erklären erst schön ein was, dann kommt entweder gar kein Code, oder dann schon ein so dermaßen komplexer Code, das man gar nicht mehr versteht, was da eigentlich gerade gemacht wird.

Gibt es da wirklich keine Dokumente, wo das "für dumme" erklärt wird?

20.01.2008 - 14:31 Uhr

Hi all,

ich habe unter anderem folgenden Klasse: "Form1" und "Konfiguration".

In Konfiguration liegen diverse Einstellungen in der form


private static string titel;

public static string Titel
{
     get { return titel; }
     set { titel = value; }
}

Gibt es jetzt eine Möglichkeit per EventHandler zu überwachen, wenn sich der Inhalt von "Konfiguration.Titel" geändert hat (OnChange)?

Also eine überwachung, wenn ein

Konfiguration.Titel = "irgendwas";

ausgeführt worden ist.

Danke schon mal im voraus für evtl Tipps.

20.01.2008 - 11:26 Uhr

Hi all,

habe ein kleines Problem mit "delegate":


delegate void delSetStatusBar(int Step, string Status);
public void SetStatusBar(int Step, string Status)
{
     //tu was
}

Dann starte ich einen neuen Thread mit folgendem Inhalt:


delSetStatusBar newSetStatusBar = new delSetStatusBar(this.SetStatusBar);
     
//tu was ........
this.Invoke(newSetStatusBar, Step, Status)
//tu was........


Was problemlos Funktioniert.

Nun wollte ich die Funktionen für den Thread aber in eine eigene Klasse auslagern, und innerhalb von Form 1 nur noch den Thread selber starten, aber dort ansonsten alles weg haben.

Ok, neue Klasse erstellt, und dann fangen die Probleme an:

delSetStatusBar newSetStatusBar = new delSetStatusBar(this.SetStatusBar);

geht dann schon mal nicht mehr, aber mit einem

public delegate void delSetStatusBar(int Step, string Status);

und dann

Form1.delSetStatusBar newSetStatusBar = new Form1.delSetStatusBar(this.SetStatusBar);

findet er zumindest das delegate wieder.

Nun hänge ich aber an dem

(this.SetStatusBar)

und weiß nicht, was ich da angeben soll, damit er das aus einer anderen Klasse heraus findet.

Kann mir da jemand evtl auf die Sprünge helfen?

Danke schon mal im voraus für einen Tipp.

20.01.2008 - 08:31 Uhr

Hi,

sowas in der art wollte ich schon verwenden, aber habe es dann aus zeitlichen gründen erst mal verworfen.

Grund: Wenn von 100 Dateien schon die 1. fehlt, dann braucht er nicht mehr weiter zu prüfen.

Bei der "langen" IF Variante macht er das dann auch, also den Abbruch bei der ersten fehlenden, während er bei der schleife das ja dennoch für die anderen Files noch durchführt bzw. prüft.

Muss mal überlegen, was man da noch machen kann, damit der Aufwand klein bleibt, aber man dennoch zusätzlich erfährt, welche Datei fehlt.

19.01.2008 - 17:08 Uhr

Hi all,

gibt es eine Möglichkeit, auf einfache Weise eine größere Anzahl von Dateien auf ihr Vorhandensein zu überprüfen?

Also so das man kein unübersichtliche

if (File.Exists("bla") && File.Exists("blub")) 

schlange bilden muss

Gibt es da eine Funktion, mit der man z.b. Prüfen kann ob alle Files die in einem Array etc. stehen vorhanden sind?

Danke schon mal im voraus für evtl Tipps.

19.01.2008 - 08:46 Uhr

Hallo herbivore,

danke für deinen Tipp, wie gewohnt passt er wie die "faust aufs Auge" 👍

18.01.2008 - 21:00 Uhr

Hi all,

ich habe ein kleines Problem mit einem OpenFileDialog.

Und zwar brauche ich nicht nur die Datei, die der Benutzer ausgewählt hat, sondern auch den Pfad, da dieser für andere Funktionen noch verwendet werden soll.

Und bevor was kommt: Ich möchte nicht erst einen FolderBrowserDialog, wenn der Anwender sowieso eine Datei auswählen MUSS.

Nur leider steht in "FileName" ja nur der gesamte Pfad samt Datei drinnen, aber leider nirgends nur der Pfad an sich.

Es ist ja schön, das ich den Anfangs Pfad für den Dialog angeben kann, aber irgendwie finde ich nichts, wie ich erfahren kann in welchem Pfad der Benutzer zu letzt war.

Und es ist nur schwer vorstellbar, das ich erst einen FolderBrowserDialog machen muss, und dann nochmal einen OpenFileDialog, nur damit ich beide Informationen erhalten kann.

Hat da jemand noch einen Tipp, wie ich zusätzlich zur Datei auch den Pfad bekommen kann.

24.11.2007 - 22:28 Uhr

Ok danke für die Antwort.

Dann macht das nur innerhalb der Applikation sinn, weil man dort was sparen kann.

Habe gemerkt das VS das ganze bei z.b. 2 Forms leider 2x anlegen will, wenn man nicht über eine Ressource geht, sondern nur über die Eigenschaften der Form 🙁

23.11.2007 - 13:06 Uhr

Hi all,

mir ist aufgefallen, das für das Programm Icon der EXE Datei, und ein evtl. benutztes Icon für eine "Form", dieses doppelt im fertigen Projekt gespeichert wird.

Gibt es eine Möglichkeit solche Icons zusammenzufassen, so das man nur noch eine ICO Datei braucht, in welcher dann die benötigten Icons in benötigter Größe enthalten sind, um damit Platz in der Applikation zu sparen?

Danke schon mal im voraus für evtl. Tips/Tricks.

23.11.2007 - 12:59 Uhr

Hallo Jürgen,

genau das habe ich gemacht 😉

23.11.2007 - 09:14 Uhr

Erst mal danke für die Tips.

Habe bereits eine Lösung für das "Problem" gefunden 🙂

21.11.2007 - 22:31 Uhr

Hi all,

ich würde gerne folgendes machen:

comboBox1 enthält eine Auswahl von A und B.

Je nachdem was nun ausgewählt ist, also A oder B soll eine(bei A) bzw. zwei (bei B) ComboBoxen zusätzlich angezeigt werden, mit weiterem Inhalt.

Also Beispiel:

A = Häuser.
B = Autos

Wenn A gewählt ist, soll eine weiter comboBox sichtbar sein, in der man auswählen kann "Haus groß, Haus Klein, mit garten, ohne Garten".

Wenn B ausgewählt wurde soll eine comboBox erscheinen mit "großes Auto, kleines Auto, 4 Sitzer, 5 Sitzer" etc. und zusätzlich eine weitere conboBox mit "Benziner, Diesel, Erdgas" etc.

Wie realisiere ich sowas am besten.

Also einmal, das je nach Auswahl der comboBox der Inhalt einer anderen comboBox geändert wird.

Und zum anderen, das je nach Auswahl eine oder mehrere comboBoxen angezeigt werden.

Danke schon mal im voraus für Tips und Informationen

20.05.2007 - 19:57 Uhr

Ja, die neuen Prozesse tauchen nur in der Prozessliste im Taskmanager auf, sonst nirgends.

Und zu deiner frage: Nicht das ich wüsste, Form 1 wird einfach per

Application.Run(new Form1());

gestartet, mehr nicht.

Sollte ich da noch was hinzufügen, damit Form1 im Vordergrund bleibt?

18.05.2007 - 17:56 Uhr

Hi all,

habe ein interessantes verhalten bei einem Programm feststellen müssen.

Start -> ca. 8,5 - 9,5 MB
Verkleinern -> 652 KB
Wiederherstellen -> ca. 4 bis max. 6 MB, nie mehr

Habe das dann mal ein einigen anderen Programmen getestet, überall das gleiche, der Speicherverbrauch sinkt beim wiederherstellen immer deutlichst unter den zuerst belegten Wert.

Woran liegt das?

Und gibt es Möglichkeiten, gleich dafür zu sorgen, das ein Programm weniger Ressourcen verbraucht, bzw. von Anfang an auf diesem niedrigeren wert bleibt?

17.05.2007 - 13:24 Uhr

Hi all,

ich starte einen Thread. In diesem Thread starte ich mehrere Prozesse, aber hintereinander, da immer erst der vorherige beendet sein muss, bevor der nächste ausgeführt werden darf.

Alles kein Problem, läuft, und eine Statusbar in Form1 wird auch brav aktualisiert.

Aber.....

Jedesmal wenn ein Prozess beendet wird, und der nächste gestartet, verlieren alle Windows Programme, egal welche kurz den Focus.

Tippe ich Beispielsweise was in Notepad, ist Plötzlich Notepad im "Hintergrund", und ich kann nichts mehr schreiben, für vielleicht 1-2 Sekunden, dann wechselt der Fokus wieder zu Notepad. Und so geht das dauernd.

Die zusätzlichen Prozesse starte ich so:


Process process = new Process();
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.WorkingDirectory = Quelle;

for (int id = 0; id < files.Length; id++)
{
     process.StartInfo.FileName = files[id].Name;
     process.Start();
     process.WaitForExit();
}

Wo müsste ich "drehen", damit die anderen Programme in ihrer Aktivität nicht gestört werden?

Danke schon mal im voraus für evtl Tipps.

Edit: Ich habe auch schon test weise eine

process.StartInfo.CreateNoWindow = true;

versucht, aber ohne erfolg.

16.05.2007 - 17:52 Uhr

@herbivore

das Problem ist, das ich gar nicht weiß, was alles in der angesprochenen Klasse drinnen steht.

Entsprechend muss ich mir ja per Reflection erst mal eine Liste aller Public Inhalte holen.

Und zu der Sache mit "GetValue(object, object[])".

Welche Angaben will er den da haben?

Ich kenne mich noch nicht so gut damit aus, um sowas "aus dem ste greif" zu wissen....

16.05.2007 - 16:26 Uhr

@winSharp93

Schon klar, aber meine Frage aus dem 1. Beitrag bezog sich darauf, wie ich die Information bekomme, die aktuell im string "Konfiguration.Test" gespeichert ist, OHNE zu wissen, das es "Konfiguration.Test" gibt.

Per Reflection bekomme ich dann zwar raus, das es "Test" gibt, aber ich brauche den aktuellen Inhalt von "Test".

Und nochmals, ich hatte gefragt, wie ich an die Information rankomme, nicht wie ich Fehlermeldungen erzeuge 😉

16.05.2007 - 16:01 Uhr

Hi,

wenn ich versuche das per


foreach (System.Reflection.PropertyInfo test in fields)
{
    MessageBox.Show(test.GetValue.ToString());
}

kommt nur ein Fehler.

"System.Reflection.PropertyInfo.GetValue(object, object[])" ist "Methode" und im angegebenen Kontext nicht gültig."

16.05.2007 - 15:47 Uhr

Hi,

ja, per


System.Reflection.PropertyInfo field = typeof(Konfiguration).GetProperty(Array[0]);
if(field != null)
{
    //Es wurde ein passendes Feld gefunden
}

16.05.2007 - 15:16 Uhr

Hi all,

über

System.Reflection.PropertyInfo [] fields = typeof(Klasse).GetProperties();

und dann per foreach komme ich zwar schön an die Namen aller vorhandenen "Variablen", aber wie komme ich an den Inhalt der selbigen?

In der "Klasse" sieht das für jeden Eintrag so aus:


private static string test;

public static string Test
{
   get { return test; }
   set { test= value;}
}

Sprich PropertyInfo liefert mir zwar "Test" zurück, aber wie komme ich an den aktuellen Inhalt von "Test"?

Danke schon mal im voraus für Tipps.

16.05.2007 - 13:52 Uhr

Hi all,

Ich habe eine Klasse Konfiguration, in der verschiedene Strings vorhanden sind.

Dann habe ein String Array, und möchte nun wissen, ob es einen entsprechenden String in der Klasse "Konfiguration" schon gibt.

Beispiel:

Array[0] = Test

Nun möchte ich wissen, ob es schon "Konfiguration.Test" gibt.

Das Problem liegt nun darin, das es ja nicht möglich ist zur Laufzeit das "Konfiguration." und dann das "Test" zu verbinden zu "Konfiguration.Test" um das prüfen zu können.

Welche Möglichkeiten gibt es noch?

Danke schon mal im voraus für evtl Tipps.

10.05.2007 - 10:47 Uhr

Danke, passt.

Edit: Falls aber jemand auch noch weiß, wie man die Anzahl der Treffer der Suche im WMI rausfinden kann, würde mich das ebenfalls interessieren.

10.05.2007 - 10:41 Uhr

Hi all,

welche möglichkeiten habe ich, die Anzahl an CPUs, wobei mir hier die Anzahl der logischen reicht, herauszufinden.

Die frage wurde hier schonmal gestellt, nur leider nicht wirklich beantwortet.

Eine mögliche Lösung habe ich schon, aber ich hänge noch:


ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
foreach (ManagementObject queryObj in searcher.Get())
{
blabla
}

Zwar kann ich so auf die einzelnen Elemente zugreifen, aber ich habe bisher nichts gefunden, mit dem ich im vorfeld die Anzahl der Treffer ermitteln könnte. Ich könnte zwar jetzt einen "Counter" bauen, der innerhalb der Schleife immer um eins höher zählt, aber ich hätte gerne die Anzahl der Treffer bereits VOR dem foreach.

Hat da jemand einen Tip für, den die Anzahl der gelieferten "Zeilen" entspricht ja dann der Anzahl der gefundenen Logischen CPUs.

Danke schonmal im vorraus für einen Tip.

04.05.2007 - 13:47 Uhr

Original von 0815Coder

Original von nin
@MS Master

kann es sein, dass das ganze einem etwas fragwürdigem Zweck dient???

kann sein.

kann aber auch einem test dienen, um zu sehen wie gut (in bezug auf stabilität) das eigentliche programm auf einem ausgelasteten rechner noch läuft... dass das programm dann langsam läuft ist klar, aber wenns dann zu irgendwo zu timeouts kommt die eigentlich trotzdem nicht sein sollten kann man das so leichter prüfen.

Du hast es schon fast erfasst. Im grunde soll das dazu dienen, auf einem Multi-Core-System das System zu Testzwecken auszulasten, und zwar alle vorhandenen CPUs gleichzeitig.

@All

hm, aber eine leere Schleife sorgt ja nicht zwangsläufig dafür, das damit das System voll ausgelastet wird.

Deswegen war ja meine frage, ob evtl jemand schon einge z.b. Mathematische Berechnung hat, die das System ziemlich belastet, welche man dann in die schleife packen könnte.

Eine andere überlegung war, das man einen Zeitwert vorgibt, z.B. 1 Stunde, und das System dann eine Stunde lang "irgendwas" berechnet.

Die frage ist jetzt, welche "Berechnung" man geschickterweise vornehmen lässt, damit einerseits die CPU ausgelastet ist (also schön heiß wird), andererseits aber nicht gleich unmengen an Speicher etc. verbraucht.

04.05.2007 - 10:44 Uhr

Hi,

danke erst mal für die Antworten.

Bei Punkt 2 war ein kleiner Fehler, ich meinte natürlich nicht 2 Tasks = 2x das Programm starten, sondern 2 Treads innerhalb des gleichen Programmes.

Und zum 1. Punkt: Es soll ja nicht endloss lange gehen, den sonst hätte man je nachdem ja Probleme das wieder zu stoppen.

Ich dachte eher daran, eine schleife x-mal durchlaufen zu lassen, damit das System solange ausgelastet ist, und danach das Programm wieder problemlos beendet werden kann.

Nur wie gesagt, was packt man sinnvollerweise in die schleife rein?

04.05.2007 - 10:19 Uhr

Hi all,

welche möglichkeiten gibt es, eine CPU per Thread zu 100% auszulasten?

Ich denke eine for schleife, die entsprechend lange läuft, aber es muss ja dann schon etwas sein, was die CPU über längere Zeit vollständig auslastet.

Was würde man da am sinnvollsten nehmen?

Und dann noch eine frage: Gehe ich dann recht in der Annahme, das wenn ich einen entsprechenden Task, der die o.g. Anforderungen erfüllt z.b. 2x Starte, das dann auf einem Dual-Core beide CPUs zu 100% ausgelastet währen?

Danke schonmal im vorraus für evtl Tips.

07.01.2007 - 12:13 Uhr

Hi all,

je nachdem ob man z.b. den Windows Classic oder den XP Style eingestellt hat, ist die ProgressBar leider unterschiedlich lang, und auch die Steps sind unterschiedlich.

Passe ich es auf Classic an, ist diese im XP Style viel länger sprich sie ist schon voll, wenn erst ca. 55-60% erreicht sind.

Passe ich diese in den Dimensionen an den XP Style an, ist diese im Classic Style aber schon viel früher voll = 100%, obwohl erst ca. 55-60% des Balkens sichtbar sind.

Daher die Frage:

Gibt es eine möglichkeit, die größe im bezug auf die Breite, sowie die Steps automatisch anzupassen, so das diese immer vollständig gefüllt wird, wenn der letzte Step = 100% erreicht werden?

Danke schonmal im vorraus für evtl Tips

05.01.2007 - 10:20 Uhr

Hi,

ok, habe mich da mal durchgeackert.

Nun lese ich zwar ziemlich oft, das man sowas wie


public static Form1 frm1 = null;

frm1 = this;

Form1.frm1.Show();
oder
Form1.frm1.Visible == true;

nicht machen soll weil das "falsch" ist.

ABER...

Wie soll man es den dann "richtig" machen, wenn das obige Falsch ist. Habe bisher nur Beiträge gelsen, wo stand das man das nicht tun soll wie oben beschrieben.

05.01.2007 - 09:09 Uhr

Hi all,

um Form1 zu verstecken habe ich bisher z.b. beim verkleinern in den Systray immer


this.notifyIcon1.Visible = true;
base.Hide();

bzw. zum wieder anzeigen entsprechend


this.notifyIcon1.Visible = false;
base.Show();

verwendet, was auch gut geht.

Wenn ich jetzt aber versuche ein


base.Hide();
Form2 frm2 = new Form2();
frm2.ShowDialog();

oder ein

base.Hide();
Form2 frm2 = new Form2();
frm2.Show();

mache klappt das zwar auch noch, aber ein

base.Show();

innerhalb der Form2 führt nicht zum gewünschten ergebniss, sprich das Form1 wieder angezeigt wird.

Wie kann ich aus Form2 dann Form1 wieder Sichbar machen?

Was mir dabei noch aufgefallen ist: Rufe ich Form2 Modal auf, lasse aber gleichzeitig das Systray Icon auf Sichbar setzen, und klicke dann auf das Systray Icon, wird Form1 wieder sichbar, was ja richtig ist, ABER es können jetzt beide Fenster paralell benutzt werden.

Ist es nicht sinn eines Modalen Dialoges, das in diesem Falle Form1 solange gesperrt sein sollte, bis Form2 wieder geschlossen wird?

Danke schonmal im vorraus für Tips.

31.12.2006 - 14:49 Uhr

@herbivore

hm, aktuell deaktiviere ich z.b. einige Buttons, damit der user nicht mehrfach draufklicken kann, während der vorgang schon läuft.

D.h. nach deiner Aussage, ich packe dann z.b. solche Sachen


this.Button1 = false;
this.Button2 = false;
this.Button3 = false;
this.Button4 = false;
this.Button5 = false;
this.Button6 = false;
etc.

komplett in eine Methode, die ich dann per Delegate/Invoke aufrufe, um das gebündelt zu ändern.

Ok, das würde ja auch das Hauptprogramm lesefreundlicher machen, da ich dort ja dann Code sparen würde.

Das mit dem warten war nur so eine Idee, dann hätte man sich einige Delegates ersparen können, das im Hauptprogramm alles einstellen/ändern, Thread starten, warten, und danach wieder passend umstellen.

Wo ich jetzt nur noch ein Problem habe, ist den Status einer Checkbox aus einem Thread herraus abzufragen, den für jede Checkbox eine eigene Methode sammt zugehörigem Delegate finde ich doch schon ziemlich aufwendig.

Sieht wohl so aus, als würde man nicht umhin kommen, alle Werte in einer Methode "zwischenzuspeichern", um diese dann aus einem Thread herraus abfragen zu können, sehe ich das richtig?

Edit1:
@herbivore

Gibt es eigentlich eine möglichkeit, das Element wechles ich Ansprechen will, erst zur Laufzeit innerhalb einer Methode zu erzeugen?

Beispiel: Statt z.b.


delegate void delSetButton1(bool Status);
public void SetButton1(bool Status)
{
    this.button1.Enabled = Status;
}
delegate void delSetButton2(bool Status);
public void SetButton2(bool Status)
{
    this.button2.Enabled = Status;
}

sowas in der art


delegate void delSetButton(string Button, bool Status);
public void SetButton(string Button, bool Status)
{
    this + Button + Enabled = Status;
}

Habs jetzt nicht versucht, ob das evtl. sogar schon die Lösung ist, aber währe sowas im prinzip möglich?

31.12.2006 - 12:30 Uhr

Hi all,

um aus einem Thread auf Elemente innerhalb von Form1 (meist ja das Hauptprogramm) zuzugreifen, wird hier immer auf InVoke etc. verwiesen.

Dazu hätte ich mal generell einige Fragen:

1.) Ist es den überhaupt möglich direkt auf ein Element innerhalb von Form1 aus einem Thread zuzugreifen?

Per


this.button.Enabled = false;
checkBox.Checked
this.statusBar.Text = "Neuer text";

etc. kann ich ja innerhalb von Form1 jedes Element ansprechen, abfragen, ändern...

Aus einem Thread geht das ja so "direkt" nicht wie ich rausgelesen habe.

2.) Welcher Weg ist der Sinnvollste, aus einem Thread eines dieser Elemente anzusprechen?

Aus dem was ich rausgelesen habe, macht man je nachdem ja einen Eventhandler, dem man entsprechend anspricht, damit dieser dann in der Form1 das Element entsprechend anpasst, oder ein s.g. Delegate, was im grunde aufs gleiche rausläuft.

Nur, bei z.b. einer Checkbox macht sowas ja keinen Sinn, oder übersehe ich da etwas?

Es währe ja schon eine menge code von nöten, nur damit jedes Element aus einem anderen Thread heraus angesprochen werden kann.

Welcher Weg währe deshalb für sowas der beste?

Ich dachte erst, das ganze in eine eigene Klasse zu Packen, wo z.b. für jede Checkbox ein Value da ist. Dann den Value aus dem Thread abfragen. Aber das erscheint mir fast mit Kanonen auf Spatzen zu schiesen. Oder ist das der richtige weg?

3.) Wie verhält es sich, wenn man aus Form1 auf das beenden eines Threads wartet (IsAlive), friert dann die Form1 nicht auch ein?

4.) Das währe ja ansonsten noch eine andere möglichkeit, um nur die wichtigsten Elemente aus dem Thread herraus ansprechen zu müssen.

Danke schonmal im vorraus für Tips.

31.12.2006 - 12:12 Uhr

@juetho

genau solchen "Spaghetticode" wollte ich ja falls möglich vermeiden.

@talla

Das mit den Funktionen mache ich ja aktuell schon in vielen Fällen, aber das "verlagert" das ja nur in eine Funktion, schafft das grundsätzliche Problem aber nicht ab.

Ich habe dann zwar im "Hauptprogramm" nur noch einen "RufeFunktionzumPrüfenauf()" drinnen, was das im "Hautpprogramm" lesefreundlicher macht, aber den "langen" Code schleppe ich ja dennoch mit mir rum.

Ich dachte, evtl gibt es bereits eine möglichkeit, mit der sich das schneller abfragen lassen würde.

Naja, danke trotzdem für eure Antworten, dann wird das halt erstmal noch wie bisher behandelt, so funktioniert es ja immerhin bereits.

31.12.2006 - 10:15 Uhr

Hi all,

es ist zwar je nachdem nicht schön, aber wessentlich kürzer mehrere if else anweisungen zusammenzufassen zu


if ( a != '' && a != int && a != 0){
 mache was
} else {
 mache was anderes
}

Das problem ist ja nun meistens, das wenn eine bedingung nicht erfüllt war, das man dann entweder nur allgemein drauf reagiert, z.b. mit einer Meldung "Sie haben nicht alle Felder ausgefüllt" oder sowas, oder dann nochmals viele einzelne abfragen dazu schreibt unm darauf differenziert eingehen zu können.

Meine frage ist jetzt, ob es eine einfachere möglichkeit gibt, zu erfahren, an welcher stelle innerhalb der if abfrage es zu einem "false" kam.

Sprich wenn die 1. false war, macht er ja gar nicht mehr weiter, aber sollte diese noch true sein, und erst die 2. false, bricht er zwar genauso ab, aber in der regel weiß man ja erst mal nicht WO abgebrochen wurde.

Es würde dann ja reichen auf den 2. "Fehler" direkt einzugehen, sofern man wüsste, das er dort abgebrochen hat.

Im 1. Falle wurde nichts eingegeben, im 2. Falle ein Wert vom Typ z.b. String, erwartet wird aber ein Wert vom Typ INT, und im dritten falle wurde eine 0 eingegeben, obwohl nur eine positive Zahl zulässig währe.

Bei meinen bisherigen Arbeiten habe ich das dann halt nochmals umständlich mit zig if -> else if -> else anweisungen überprüft, was das ganze je nachdem nicht unbedinkt lesefreundlicher macht.

Gibt es da einen besseren Weg, mit dem man sofort die Abbruchbedingung erfahren kann, um direkt evtl. mittels switch/case anweisung darauf eingehen zu können?

Danke schonmal im vorraus für Tips.

25.12.2006 - 13:17 Uhr

Hm,

und wie "warte" ich dann auf den Thread?

Aktuell blockiere ich zwar die Gui, aber das Programm "wartet" wirklich bis alle Prozesse durchlaufen wurden.

Habe das mal versucht als Thread zu starten, und dann meldet das Programm sehr schnell das angeblich alles fertig sei, während ich im Taskmanager sehen kann, das da noch ein Process nach dem anderen im hintergrund gestartet wird.

25.12.2006 - 12:27 Uhr

Hi,

unter anderem führe ich folgendes aus:


System.Diagnostics.Process test = new System.Diagnostics.Process();
test.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
test.StartInfo.FileName = "test.exe";
test.Start();

In einem anderen Programm, wo ich das gleiche Problem habe, führe ich innerhalb einer Schleife sogar mehrere Programmaufrufe aus


System.Diagnostics.Process update = new System.Diagnostics.Process();
update.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
update.StartInfo.Arguments = "/integrate:" + Konfiguration.Path + " /quiet";
update.StartInfo.WorkingDirectory = Quelle;
for (int id = 0; id <= files.Length - 1; id++)
{
	update.StartInfo.FileName = files[id].Name;
	update.Start();
	update.WaitForExit();
}

Dort ist es momentan noch schlimmer, da dort natürlich die ganze Gui hängt. Das will ich aber noch auf Threads umstellen um das zu vermeiden, soweit das möglich ist, da das nächste Programm erst ausgeführt werden darf, wenn der vorherige aufruf erfolgreich durchlaufen wurde.

25.12.2006 - 10:19 Uhr

Hi all,

habe in einer Aplikation unter VS 2005 aktuell das problem, das die Statusleiste bzw. der StatusStript nicht aktualisiert wird.

Also


this.statusBar1.Text = "Mache was";
Code.....
this.statusBar1.Text = "Mache was anderes";
Code.....
this.statusBar1.Text = "Fertig";

Wird erst aktualisiert, wenn alles Fertig ist, also direkt auf den letzten Wert.

Dazwischen passiert nichts.

Wo muss ich da drehen, das der text sofort aktualisiert wird.

Danke schonmal im vorraus für evtl Tips.

23.12.2006 - 16:07 Uhr

Hi all,

danke erst mal für eure ausführungen. Also einen wirklichen 100% Schutz scheint es dann nicht wirklich zu geben.

Wobei ich aktuell sagen muss, das ich froh darüber bin, da ich so meine daten wieder zurückbekommen habe. Das bisschen Bemerkungen dazu, der natürlich fehlt ist ja gleich wieder dazu geschrieben.

23.12.2006 - 13:27 Uhr

@Borg

danke, das passt. Wusste gar nicht, das es so "leicht" sein kann.

Für meinen Teil ist das ja jetzt sehr hilfreich gewesen, und bin froh das es sowas gibt.

Aber nur mal so gefragt, gibt es eine möglichkeit das zu verhindern?

23.12.2006 - 12:41 Uhr

Hi all,

mir sind nach einem Plattencrash teile des aktuellen Codes zerstört worden für ein Programm.

Die letzte Sicherung ist aber leider schon ein wenig älter, so das die letzten gemachten Änderungen jetzt leider verloren gegangen sind.

Gibt es eine möglichkeit, aus der Kompilierten EXE teile des Codes wieder zurückzubekommen?

Danke schonmal im vorraus für evtl Tips.