Laden...

Forenbeiträge von Natsukawa Ingesamt 20 Beiträge

26.07.2006 - 13:50 Uhr

Hallo Traumzauberbaum

Ich hab mal dein Beispiel genommen und bekomme dabei folgende Ausgabe:

Nutze name2
Nutze name1
name2
name2

Und genau da sieht man das Problem, die Funktion Write wird nämlich nicht einmal mit 'name1' und einmal mit 'name2' aufgerufen, sondern 2x mit 'name2'. Das soll aber nicht passieren. Das von mir eingebaute Lock in Write, hatte imemrhin noc geschützt, wenn das Wait zwischen den Aufrufen etwas größer war, jetzt fehlt sogar dieser Schutz.

Natsukawa

24.07.2006 - 21:28 Uhr

Hallo

Damit verschiebt man das Problem leider nur um einen Ebene, weil beide dann die Funktion Write aufrufen und so der Parameter überschriebenw ird. Bleibt wohl wirklich nur übrig, um die Funktionsaufrufe in den einzelnen Klassen ein lock zu setzen.

Ich hatte die Hoffnugn es gibt sowas wie ein ThreadSafe Attribute für Funktionen.

Natsukawa

24.07.2006 - 14:34 Uhr

Hallo,

Ja eigentlich schon, aber es ist in der echten Anwendung nicht nur einer, sondern gleich 5 Parameter. Die Funktion wird dabei ans ehr vielen Stellen aufgerufen, udn die Wahrscheinlichkeit eines Treffers ist gering. ich will aber nicht durch ein lock in allen aufrufenden Klassen die Sicherheit erzeugen, weil man da dann Fehler so schwer findet.

Natsukawa

24.07.2006 - 14:11 Uhr

Hallo,

Ich bin gerade am Suchen, ob es eine Lösung für das folgende Problem gibt.

Ich habe eine Funktion, die mit meheren Parametern gestartet wird. Dabei dürfen Objekte aus verschiedenen Threads diese Funktion starten. Nun möchte ich aber sichergehen, dass die Funktion wirklich genau mit den Parametern durchläuft mit denen sie gestartet wird. Mit einem lock kann man verhindern, dass 2 Blöcke parallel gestartet werden. Aber irgendwie schützt das lock anscheinend nicht den Anfang. Wird die Funktion 2x nahezu zeitgleich aufgerufen, läuft sie 2x mit den Parametern des 2. Aufrufs.

Ich hab dafür mal ein kleines Testprogramm geschrieben, um die Konstruktion darzustellen. Im wirklichen Programm gibt es natürlich mehr Klassen und deutlich mehr Threads.

	
public class Program
{
  public static string _name = "name1";
  public static object _lockObject = new object();
  public static void Write(string name)
  {
    lock(_lockObject)
   {
      Thread.Sleep(1000);
      Console.WriteLine(name);
    }
  }

  public static void WriteName()
  {
    Console.WriteLine("Nutze " + _name);
    Write(_name);
  }

  static void Main(string[] args)
  {
    ThreadStart start = new ThreadStart(WriteName);
    Thread t = new Thread(start);
    t.Start();
    Thread.Sleep(1);
    _name = "name2";
    WriteName();
    t.Join();
    Console.ReadLine();
}
	}

Kann mir jemand einen Tipp geben, wie man dieses Problem umgehen kann.

Danke,
Natsukawa

07.04.2006 - 18:14 Uhr

Hallo,

ich vermute eher nicht, weil es auftritt, wenn ich eigene Controls nutze (die keine speziellen therads doer so haben). Der Rest des Programmes, der erst durch ein Event ausgelöst wird, ist nicht davon betroffen. d.h. wenn ich andere Controls einbinde, kann ich diese sehen, aber halt nicht meine eigenen.

Außerdem gibt es eindeutig Rechteeinschränkungen für Netzlaufwerke. Damit ich dort etwas debuggen kann, musste ich auch erst diesem Laufwerk in der Configuration vertrauen, allerdings weist einen Visual Studio in dem Fall darauf hin.

Udn wir haben gestern lange Fehlersuche betrieben. Dre Fehler tritt genau dann nicht mehr auf, wenn man dem Laufwerk in der Configuration vertraut.

Natsukawa

07.04.2006 - 17:12 Uhr

Hallo,

ich will euch jetzt ja nicht die Lösung des Problems verschweigen.

Das Problem war, dass die Anwendung auf einem Netzlaufwerk lag. Wenn man nur das.Net 2.0 Farmework installiert, kann man aber dem Netzlaufwerk nicht vertrauen. Doch anstatt das als Fehler zu melden, gibt es nur ein paar Darstellungsprobelem mit eigenen Controls. Die Lösung liegt also darin, die Anwendung entweder lokal zu starten, oder die Tipps auf http://blog.rasehorn.net/?p=44 zu befolgen.

Natsukawa

05.04.2006 - 16:12 Uhr

Hallo,

Leider wird die MessageBox gar nicht angezeigt. Auch tritt das Problem konstant auf einigen Rehner auf, während es sonst nie Probleme auf anderen gibt. Auch wird ein TreeView nicht angzeigt, dass MainMenu und ein Panel aber schon. Und bei einer anderen Anwendung, funktioniert alles.
Also denke ich, hat das ganze nichts mit dem anderen Post zu tun ... leider.

Natsukawa

05.04.2006 - 15:17 Uhr

Hallo,

Ich hab einen seltsamen Effekt. Auf einem Rechner werden die Controls nicht angezeigt. Das Main Menu kann ich sehen, aber die anderen Controls werden zum größten Teil nicht angezeigt. Auch eine MessageBox wird nicht angezeigt. Auf allen anderen Rechner funktioniert es aber. Hat da jemand ne Idee, woran es liegen kann?

Natsukawa

16.03.2006 - 11:02 Uhr

Hallo,

Kannst du auch deinen Quellcode von VB posten, damit man die mal vergleichen kann. Ich hab ja schon ein paar Ideen, was es sein kann, aber irgendwie würden mich die Unterschiede schon interessieren.

Also ich verstehe zum Beispiel nicht, warum du in jedem Schleifendurchgang ein neues Objekt vom Typ Random erstellst, es reicht, wenn du das einmal ausserhalb der Schleife machst.
Da du ja anscheinend nur die letzte Zufallszahl ausgeben willst, würde das auch bessre sein, wenn du das ausserhalb der Schleife machst. Dazu müsstest du zahl nur einmalig vor der Schleife initialisieren.
Ausserdem ist es immer besser, bei einer solchen Schleife eine for-Schleife zu wählen. Auch wenn das vielleicht nicht Auswirkungen auf die Zeit hat.

Natsukawa

15.03.2006 - 16:40 Uhr

Hallo,

Danke, dass mit dem Bin-Fertig-Event werd ich gleich mal probieren.

Natsukawa

15.03.2006 - 15:55 Uhr

Hallo,

Ja der Hauptthread muss auf die anderen Threads warten. Das liegt daran, dass zwischendurch einige Aufgaben parallel in den Threads laufen, und danach der Hauptthread etwas auswerten muss.

Beispiel posten ist etwas schwierig, es verteilt sich auf viele Klassen und so.

Wieos muss den der Hauptthread beendet sein, damit die Nachrichten zur Control durchgereicht werden?

Natsukawa

15.03.2006 - 15:08 Uhr

Hallo,

Nach der Umstellung auf .Net 2.0 kam bei mir genau die gleiche Fehlermeldung. Also habe ich auch die Delegates und Invokes eingebaut. Mein Problem ist jetzt, dass die Invokes erst ausgeführt werden,w enn der Thread beendet ist. Das hat zur Folge, dass alle Nachrichten die ich in einem Fenster ausgeben wollte, erst ganz am Ende angezeigt bekomme. Damit fehlen dem Nutzer genau die Rückmeldungen, um die es mir dabei ging. Hat jemand ne Idee, was ich daran ändern muss.

Natsukawa

24.01.2006 - 13:42 Uhr

Danke für den Tipp, das genannte Tool scheint brauchbar zu sein. Zusammen mit dem Tool von vil kann man dann ne Menge Auswertungen erstellen und anderen Leute mit viel Statistik überhäufen ^_-.

Natsukawa

17.01.2006 - 17:36 Uhr

Hallo,

Kennt irgendjemand noch ein anderes Metriktool für CSharp als das von vil. Das Tool von vil untersucht ja leider nicht die C# Sourcen sondern den Zwischencode. Das ist für einige Metriken zwar ausreichend, vor allem für die objektorientierten, aber die einfachen Metriken wie LOC-Metriken sind so ja nun nicht wirklich genau.

Natsukawa

17.10.2005 - 20:32 Uhr

Hallo,

Wenn du dir meinen Quelltext ansiehst, siest du, das ich eine Tabpage hinzufüge, die von TabPage erbt. Im vollständigen Projekt sind auch TabControl und andere Forms geerbt. Dadurch findet die Initalisierung immer vor der Festlegung der Größe statt. Und auch wenn ich im Konstruktor vorher die Größe setze bevor ich auch nur einen TabPage hinzufüge funktioniert es nicht.

Außerdem sollte die Größe der GroupBox nicht von der Größe der Tabpage oder des TabControl abhängen. Also ich denke schon, dass es ein Fehler in der Umsetzung ist. Und das interessanteste ist ja, das es ohne die Anchors bei der Textbox und GroupBox funktioniert.

Ich kann jetzt hier nicht das ganze Projekt verlinken, das ist schon ziemlich groß und unübersichtlich, aber meine Vorgehensweise ist immer: Erzeugen - Größe und Position festlegen - zur Control hinzufügen - die untergeordneten Controls in der gleichen Reihenfolge festlegen.

Und wie gesagt, dass erste was ich versucht habe, war verschiedenen Reihenfolge im Aufruf zu versuchen.

Natsukawa

17.10.2005 - 19:40 Uhr

Hallo,

Also solange man die Größe während der Initilaisierung festlegt und nicht zur Laufzeit, ist es egal, in welcher Reihenfolge man es macht. Der Tausch der Reihenfolge ist dabei wirklich egal. Weitere Forschungen haben gebracht, das das Clientrectangle der TabControl zu klein ist. Und genau dieses zu klein, im Vergleich zur gesamten TabControl ist die Verschiebung der Größe. Mich würde wirklich mal der Source Code dieser Klassen interessieren.

Hier handelt es sich wirklich um einen Fehler in den genutzten Klassen, nciht um einen Programmierfehler. (Auf so ne einfache Lösung wie das umdrehend er Reihenfolge bin cih als erstes gekommen).

Natsukawa

17.10.2005 - 10:28 Uhr

Hallo,

die Breite der GroupBox ist nicht das Problem. Vielmehr gibt es einen anderen interessanten Effekt. Anscheined wird die Breite auf einen festen Wert (ich vermute mal 200px) festgelegt. Wenn man nun eine kürzere Textbox haben will, muss man einen negativen Wert angeben, in meinem Fall also -60. Das gleiche gilt auch für die Groupboxen. Da hatte ich nur kein Problem, weil es zufälliger Weise die richtige Größe war.

Vielleicht stelle ich nachher mal den Quellcode hier mit ein, dann kann das jeder gerne selbst ausprobieren. Jetzt bin ich eigentlich nur noch auf eine Antwort gespannt, warum das so ist.

Natsukawa

Edit: So jetzt ahbe ich den entsprechenden Source rangehangen, dann kann sich jedre den Bug mal ansehen. Die 1. Textbox wird mit der Größe 120 gestartet und bekommt sofort die Größe 322. Diese Größe ist übrigens vond er TabControl Größe abhängig, wenn die TabControl die Breite 208 hat, ist alles in Ordnung, wenn nicht wird halt die Größe der Elemente verändret, wenn sie Links und Rechts verankert werden.

15.10.2005 - 23:18 Uhr

Hallo,

Ich denke genau das habe ich gemacht (siehe Source-Code).

Was die gleiche Größe angeht, ich habe das schon mit jeglichen Größen versucht. Deswegen suche ich jetzt jemanden,d er das gleiche Problem auch schon hatte und eine Lösung gefunden hat.

Natsukawa

15.10.2005 - 22:31 Uhr

Hallo

Ich habe eine TabPage in der innerhalb einer Group sich mehrere Textboxen befinden. Diese Textboxen passen sich mit Hilfe von Anchor an die Größe der Tabpage beim Skalieren an. Wenn ich das aber mache, kann ich nichtmehr die Ausgangsgröße der Textbox festlegen. Auf jegliche Properties, die dies beeinflussen, wird nicht reagiert. Es wird stattdessen eine Standardgröße gewählt. Dies ist aber zu groß und reicht dann über die Textbox hinaus. Das sieht dann ziemlich besch... aus. deswegen will ich es schaffen, die variable Größenanpassung wie bei Anchors zu nutzen, aber auch die Ausgangsgröße der Txetbox variabel bestimmen können.

Bei anderen Controls, wie Treeviews, etc. tritt dieses Phänomen allerdings nicht auf.

Natsukawa

14.10.2005 - 20:53 Uhr

Hallo,

Ich habe ein Problem mit der Anchor-Funktion einer Textbox. Die Textbox ist in einer GroupBox eingebunden. Wenn ich die Anchor Eigenschaft so setze, das sie gestreckt wird (Left | Right), dann wird die Position und die Größe der Textbox nicht beachtet. Das Ganze befindet sich in einer TabPage. Die Veränderung der Größe funktioniert auch so, aber die Textbox nimmt eine andere Größe an, als die vorgegebene.


GroupBox batchSetting = new GroupBox();
batchSetting.Text = "Settings for Batch";
batchSetting.Height = 140;
batchSetting.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
Controls.Add(batchSetting);

Label inputdirLabel = new Label();
inputdirLabel.Text = "Input Directory:";
inputdirLabel.Top = 20;
inputdirLabel.Left = 10;
inputdirLabel.Anchor = AnchorStyles.Left;
batchSetting.Controls.Add(inputdirLabel);

TextBox inputdirText = new TextBox();
inputdirText.Text = _inputdir;
inputdirText.Left = 100;
inputdirText.Top = 15;
inputdirText.Width = 140;
inputdirText.Anchor = AnchorStyles.Left | AnchorStyles.Right;
inputdirText.TextChanged += new EventHandler(_inputdirText_TextChanged);
batchSetting.Controls.Add(inputdirText);
...

Ich hoffe jemand kann mir einen Tipp geben, wie ich das trotzdem hinbekommen kann.

Natsukawa