Laden...

Forenbeiträge von steffen_dec Ingesamt 322 Beiträge

10.09.2014 - 16:25 Uhr

Hallo Peter,

hast Du mal in die Ereignisanzeige von Windows geschaut? Dort steht manchmal mehr drin. Vielleicht ist die ThreadAbortException ein Folgefehler...

Gruß
steffen_dec

04.09.2014 - 11:23 Uhr

Hallo,

was möchtest du den danach machen?

so vielleicht (ungetestet)?


for (int i = 0; i < kuList.Count; i++)
{
  if(diffDic.ContainsKey(kuList[i]))
  {
    Debug.WriteLine("Key: " + kuList[i] + " Value: " + diffDic[kuList[i]]);
  }
}

28.07.2014 - 08:07 Uhr

Hallo Exis,

wenn Du Deinen Versuch (Quellcode) hier postest, könnte Dir auch geholfen werden. 😉

Gruß

28.07.2014 - 07:45 Uhr

Hallo,

ja dann mal doch ein Kreis drum herum!?

Graphics.DrawEllipse-Methode (Pen, Single, Single, Single, Single)

in WPF wird es sicherlich auch gehen...

21.07.2014 - 09:41 Uhr

Hallo,

der "sender" ist ja die Instanz wo der Klick ausgelöst wurde, diesen wandelst du in ein Toolstripmenuitem und suchst mit "this.meinName.ToolStripMenueItem.DropDownItems.IndexOf(...)" nach dem Item...

Gruß
Steffen

17.07.2014 - 15:54 Uhr

Hallo,

was ist wenn du ZedGraph nur alle 10 Werte aktualisierst? Bei 130 Paint-Aufrufen in einer Sekunde, kommt das menschliche auge ehe nicht mit...

ups, der Thread ist ja uralt, bin wohl über Google irgendwie draufgekommen und gar nicht gemerkt 😁

26.06.2014 - 08:16 Uhr

Hallo Zusammen,

danke für die zahlreichen Vorschläge.

Ich habe es nun mit Erweiterungsmethoden gemacht (IsMoreThan, IsLessThan, IsMoreOrEqualThan, IsLessOrEqualThan)... Alles andere wäre zu aufwändig.

Gruß
Steffen

25.06.2014 - 16:07 Uhr

Hallo Zusammen,

ich habe ein Enum:


public enum ETestEnum
{
    Small = 1,
    Middle = 2,
    Big = 3
}

Mit dem Enum kann man ja zwei Werte miteinandere problemlos vergleichen:


ETestEnum e1 = ETestEnum.Small;
ETestEnum e2 = ETestEnum.Middle;
bool bSize = e2 > e1;

Nun wird das Enum erweitert:


public enum ETestEnum
{
    Small = 1,
    Middle = 2,
    Big = 3,
    SmallBigger = 4,
    MiddleBigger = 5
}

Nun möchte ich bei einem Vergleich eine eigene Definition vorgeben, SmallBigger soll zwischen 1 und 2 sein und MiddleBigger zwischen 2 und 3... Beispiel:


ETestEnum e1 = ETestEnum.SmallBigger ;
ETestEnum e2 = ETestEnum.Middle;
bool bSize = e2 > e1;  //hier sollte True rauskommen, in dem Fall ist es aber False da ja bekannterweiser 2(Middle) kleiner ist als 4(SmallBigger). 

Die Indizees dürfen aus Kompatibilitätsgründen nicht verschoben werden (Umwandlung aus gespeicherten INT-Values zu dem Enum und Kompatibilität zu einer anderen Bibliothek). D.h. ich möchste selbst definieren dass SmallBigger größer sein soll als Small und kleiner als Middle... usw.

Gibt es da eine Möglichkeit?

Vielen Dank für Eure Hilfe!

Steffen

16.05.2014 - 15:27 Uhr

Hallo,

ich habe es nun so gelöst dass ich beim deaktivieren einer Checkbox ein Label anzeige welches direkt darüber liegt. So habe ich identisches Verhalten wie bei einem Label.

Grüße
Steffen

15.05.2014 - 14:16 Uhr

diese Eigenschaft besitzt ein Windows.Forms.Label nicht
Label-Eigenschaften

Wenn ich die Eigenschaft UseVisualStyleBackColor der Checkbox ändere, dann verhält es sich genauso.

15.05.2014 - 13:48 Uhr

Hallo,

die Workarounds sind schön und gut, aber ich verstehe nicht warum sich diese Controls unterschiedlich verhalten!?

Vielleicht muss ich nur noch irgendeine Property setzen!?

15.05.2014 - 12:03 Uhr

Hallo,

ich habe ein komisches Phänomen welches ich nicht ganz verstehe warum es so ist.

Eine Checkbox und ein Label sind in einer Form, bei beiden wird zur Laufzeit die BackColor gesetzt, wenn man nun Enabled auf false stellt dann haben die beiden Controls unterschiedliche Font-Farbe...

Im Anhang habe ich ein Screenshot zur Verdeutlichung angehängt.

und nun der Quellcode:

Form1


 /// <summary>
    /// Form1 test dialog
    /// </summary>
    public partial class Form1 : Form
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="Form1" /> class.
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            checkBox1.Enabled = !checkBox1.Enabled;
            label3.Enabled = !label3.Enabled;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            checkBox1.BackColor = Color.FromArgb(255, 250, 240, 230);
            label3.BackColor = Color.FromArgb(255, 250, 240, 230);
        }
    }

Form1.Designer


 partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.checkBox1 = new System.Windows.Forms.CheckBox();
            this.label3 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(30, 54);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.Button1_Click);
            // 
            // checkBox1
            // 
            this.checkBox1.AutoSize = true;
            this.checkBox1.BackColor = System.Drawing.SystemColors.Control;
            this.checkBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.checkBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.checkBox1.Location = new System.Drawing.Point(240, 32);
            this.checkBox1.Name = "checkBox1";
            this.checkBox1.Size = new System.Drawing.Size(129, 28);
            this.checkBox1.TabIndex = 0;
            this.checkBox1.Text = "checkBox1";
            this.checkBox1.UseVisualStyleBackColor = false;
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.BackColor = System.Drawing.SystemColors.Control;
            this.label3.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label3.Location = new System.Drawing.Point(261, 75);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(66, 24);
            this.label3.TabIndex = 1;
            this.label3.Text = "label3";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(439, 144);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.checkBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.CheckBox checkBox1;
        private System.Windows.Forms.Label label3;
    }

Hat jemand eine Idee warum es so ist und wie man es verhindern kann, bzw. dass es sich gleich verhält...

danke
Steffen

28.03.2014 - 14:30 Uhr

Hallo,

wenn ich es richtig verstanden habe, brauchst Du hier Reflection

hier ein paar Beispiele:
http://www.csharp-examples.net/reflection-examples/

sonst einfach danach googeln oder hier im Forum suchen

Gruß
Steffen

16.03.2014 - 10:11 Uhr

Hallo MorphieX,

hast Du in der Richtung schon was neues gefunden?

Bräuchte da auch was für die Syncronisation.

Danke und Gruß
Steffen

10.03.2014 - 15:47 Uhr

Hallo,

hier ein Beispiel wie man es machen kann:

VORSICHT: NICHT GETESTET!


namespace ConsoleSerialPort
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort port = new SerialPort("COM1");
            port.Open();
            port.PinChanged += new SerialPinChangedEventHandler(port_PinChanged);

            //Ausgangssignal setzen RTS oder DTR (sollten mit Optokoppler entkoppelt sein!)
            port.RtsEnable = true;
            port.DtrEnable = true;
        }

        static void port_PinChanged(object sender, SerialPinChangedEventArgs e)
        {
            SerialPort port = sender as SerialPort;

            //Eingangssignal einlesen
            switch (e.EventType)
            {
                case SerialPinChange.Break:
                    break;
                case SerialPinChange.CDChanged:
                    break;
                case SerialPinChange.CtsChanged:
                    Console.WriteLine("CTS Signal: " + port.CtsHolding.ToString());
                    break;
                case SerialPinChange.DsrChanged:
                    Console.WriteLine("DSR Signal" + port.DsrHolding.ToString());
                    break;
                case SerialPinChange.Ring:
                    break;
                default:
                    break;
            }
        }
    }
}

Gruß
Steffen

16.12.2013 - 21:21 Uhr

Hallo,

hast Du schon mal hier geschaut?
A Professional Calendar/Agenda View That You Will Use

Ich habe damals den hier aus dem Forum auch getestet und fand aber den von Code-Project besser. Ich hab diesen bei mir schon am laufen, mit speichern/laden der Termine in/aus der DB.
Vielleicht wirst Du daraus schlauer!?

Gruß
Steffen

10.12.2013 - 16:52 Uhr

Hallo Zusammen,

danke für eure Antworten!

Dass was ich gemeint habe war wohl "Constrained Execution Regions".

Mal schauen ob ich daraus schlau werde und es was bringt...

Grüße
Steffen

10.12.2013 - 16:04 Uhr

Hallo herbivore,

habe ich es vielleicht verwechselt!?
Kann man einen Block definieren welcher vom GC nicht unterbrochen werden darf?

10.12.2013 - 15:16 Uhr

Hallo Zusammen,

wir befinden uns hier in einer Multithreading Applikation.

Ich erinnere mich nur ganz dunkel daran dass es wohl eine Möglichkeit gibt einen bestimmten Block oder Funktion zu markieren dass diese von einem anderem Thread nicht unterbrochen werden darf... (jetzt nicht mit lock...)

Diese bestimmte Funktion (Callback-Routine einer Bibliothek) ist krititsch und darf nicht von einem anderen Thread unterbrochen werden. Es geht hier darum dass diese Stelle auch nicht vom GUI-Thread oder Windows unterbrochen werden darf,,,

Würde mich freuen wenn mir einer auf die Sprünge hilft, mir fällt es gerade nicht ein und über die Suche habe ich nichts derartiges gefunden.

Danke
Steffen

15.11.2013 - 20:06 Uhr

Hallo Khalid,

dieses Property habe ich schon auf False, dies funktioniert wahrscheinlich nur wenn man mit dem Control eine Website (also html) aufruft...

Probier doch mal eine XPS-Datei aufzumachen, du kannst z.b. mit Word jedes Dokument als XPS-Datei abspeichern...

15.11.2013 - 14:46 Uhr

Hallo,

ich möchte eine XPS-Datei direkt im Programm anzeigen, dazu verwende ich eine Instanz von System.Windows.Forms.WebBrowser:


WebBrowser webControl = new WebBrowser();
webControl.AllowNavigation = false;
webControl.AllowWebBrowserDrop = false;
webControl.IsWebBrowserContextMenuEnabled = false;
webControl.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
webControl.ScriptErrorsSuppressed = true;
webControl.WebBrowserShortcutsEnabled = false;
                    
webControl.Url = new Uri(strFile); //in strFile ist der lokale Pfad zur XPS-Datei abgelegt
webControl.Location = new Point(0, 0);
webControl.Dock = DockStyle.Fill;

webControl.ContextMenu = null;
webControl.ContextMenuStrip = null;
webControl.ScrollBarsEnabled = true;

Dies klappt alles wunderbar. Nun hat der Bediener die Möglichkeit über Kontextmenü bestimmte Befehle auszuführen und dies möchte ich verbieten da es sich um ein geschlossenes System handelt, der Benutzer könnte hier "Save as" wählen und auf Laufwerk C: wichtige Daten/Dateien löschen...

Ich habe hier nun verschiedenes probiert siehe Code, nur keins klappt wirklich.
Das Kontextmenü wird lediglich nicht angezeigt wenn WebBrowser auf Enabled=False steht. Allerdings kann der Benutzer dann auch nicht scrollen, und meine Versuche hier eine eigene Scrollbar anzulegen sind auch gescheitert...

Was mache ich hier falsch?
Wenn jemand ein anderes Control kennt wo man es einstellen kann bitte melden.

Ich habe auch schon die ReportViewer probiert (Crystal und Microsoft) allerdings können diese keine XPS-Dateien öffnen, nur speichern...

Danke im Voraus.

Gruß
Steffen

EDIT:
habe soeben was bei Codeproject gefunden:
Disable the WebBrowser control context menu

Allerdings funktioniert es auch nicht, weil in dem Fall "webControl.Document" = null ist. Ich denke weil da der XPS-Viewer von Win7 ins Spiel kommt...

29.06.2013 - 02:23 Uhr

Hallo,

in manchen Fällen ist es notwendig das "Arbeitsverzeichnis" zu setzen...
ProcessStartInfo.WorkingDirectory-Eigenschaft

Gruß
Steffen

27.05.2013 - 17:35 Uhr

Es handelt sich um eine Desktop-Anwendung, genauer gesagt werden hier Bilder von GigE-Kameras ausgewertet (Bildverarbeitung). Wobei die reine Auswertung in einer Bibliothek (unmanaged mit .Net-Wrapper) von Dritthersteller stattfindet.

Die Berechnungszeit beim ersten Bild geht aber auch nicht rein für die Bildauswertung der BV-Bibliothek sondern auch an dass drumherum.

Nun muss ich schauen dass ich diese Zeit drumherum so gering wie möglich halte, auch nach einem Kaltstart.

27.05.2013 - 15:09 Uhr

Hallo,

Profiler ist hier etwas schwierig da dieser ja die Performance ebenfalls verschlechtert...
Man kann aber natürlich die erste Berechnung mit der zweiten Vergleichen, dies werde ich mal angehen.

Kann es sein dass mir da Windows einen Streich spielt indem die Threads beispielsweise einem anderem Kern zugeordnet werden und während dessen der Trigger für die Berechnung kommt?

Als CPU wird hier ein Xeon E5-2660 mit Win7 x64 und 16GB Ram eingesetzt.

21.05.2013 - 23:15 Uhr

Hallo,

die erste Berechnung kann willkürlich nach dem Neustart kommen (abhängig von meinem "Bereitsignal"), ich habe schon mal paar Minuten gewartet bis ich einen "Trigger" ausgelöst habe.

Bei der zweiten Berechnung ist es dann immer gleich viel schneller. Es ist immer nur die erste Auswertung nach dem Kaltstart die Probleme verursacht. Es geht mir hier nicht um die Dauer des Startvorgangs (dieses ist nicht relevant und darf quasi beliebig lang gehen da der Master auf ein Signal von uns wartet). Während dem Startvorgang mache ich bereits eine Pseudo-Auswertung um so die Berechnungszeit für die echte erste Berechnung zu minimieren, dies ist jetzt schon viel besser geworden, aber eben noch nicht ausreichend.

@gfoidl:
Den Thread habe ich auch schon vorher durchgelesen und die Links auch teilweise, aber so wie ich es verstanden habe geht es da in den Links eher um die Dauer des Startvorgangs und nicht die allgemeine Performance!? Die Auslagerung des Kerns ist nicht so einfach möglich, gewisse Teile sind bereits als Plugins ausgelagert und der Kern ist eben noch in der Haupt-Applikation (natürlich auf verschiedene Threads aufgeteilt).

Für weitere Hinweise bin ich sehr dankbar 👍

MfG
Steffen

21.05.2013 - 19:10 Uhr

Hallo,

wir haben bei unserer Applikation ein Problem dass mit dem Kaltstart (also PC-Neustart) zu tun hat.

Bei unserer Applikation (C# 4.0.3, VS2010) finden komplexe Berechnungen statt, diese müssen so schnell wie möglich erledigt sein (im Mittelwert darf die Berechnungszeit die 180ms nicht übersteigen).

Wenn ich nun unser Programm immer manuell neustarte habe ich keine Probleme, auch nicht beim ersten Aufruf der Berechnung. Diese ist zwar geringfügig länger, ist aber noch im grünem Bereich (max. 120ms).

Wenn ich nun den PC komplett neustarte, dann ist es sehr oft so dass die Zeit nicht mehr ausreicht. Die Berechnungszeit liegt dann bei maximum 308ms.

Wenn man die erste Berechnung außen vor lässt, liegt die normale Berechnungszeit bei ~90ms.

Während der Initialisierung wird bereits jede mögliche Instanz der vorhanden Plugins erstellt damit .Net die Bibliotheken nachladen kann um hier die Zeit zu minimieren. Desweiteren wird dabei auch eine Pseudo-Berechnung ausgeführt um hier ebenfalls die Bibliotheken nachzuladen, dies hat schon eine deutliche Verbesserung gebracht, nur leider immer noch nicht ausreichend (vorher waren wir bei 600-1500ms).

Ich habe bereich mit NGEN getestet und es hat uns keine Besserung gebracht.

Hat jemand eine Idee was man noch probieren könnte?

Danke im Voraus
Steffen

13.05.2013 - 10:40 Uhr

Hallo,

ich möchte unser Programm für Touch-Monitore optimieren.

Im Programm haben wir eine Toolstrip, diese kann von der Größe eingestellt werden.
Problem ist nun, wenn die Größe so groß gewählt wird dass nicht mehr alle Icons draufpassen, wird ja ein "Overflow Menü" angezeigt.
Um nun dieses Overflow DropDownMenu zu öffnen, muss man den 16-Pixel schmalen Pfeil mit dem Finger treffen und dies ist recht schwierig.

ich habe es nun so probiert die Größe einzustellen:


tsFormat.OverflowButton.AutoSize = false;
tsFormat.OverflowButton.Width = 32;
//tsFormat.OverflowButton.Text = "Menu";
//tsFormat.OverflowButton.TextImageRelation = TextImageRelation.TextBeforeImage;

Dies hat alles nicht funktioniert.
Hat jemand eine Idee was man da noch machen kann?

Danke
Steffen

10.05.2013 - 16:44 Uhr

Aber ein TopMost Fenster kann man doch immer noch minimieren?
(Beispiel TaskManager)

Du müsstest zusätzlich dazu den Fenster-Status überwachen.

Willst Du das Fenster quasi andocken am Rand? damit z.b. Word es nicht überlappt?

C# - Programm am Desktop andocken

Sticky Windows - How to make your (top-level) forms to stick one to the other or to the screen

Creating an application like Google Desktop in WPF and C#

22.01.2013 - 11:16 Uhr

Hallo,

ich würde follgenden Workaround vorschlagen:

  • erstelle einen Timer mit AutoReset = false, und Interval auf z.B. 1000 ms (=> 1 Sek)
  • im Tick-Event des Timers rufst du deinen Backgroundworker auf
  • im gridView1_FocusedRowChanged prüfst du wenn Timer läuft dann diesen anhalten und dann neustarten, wenn dieser noch nicht läuft dann den Timer starten.

D.h. beim Zeilenwechsel wird jedesmal der Timer neu angestoßen. Wenn der Benutzer nun z.b. die 1 Sekunde dort verweilt, wird dein Backgroundworker angestoßen.

Gruß
Steffen

19.01.2013 - 00:05 Uhr

Hallo Tom,

dein Tool ist echt sehr nützlich wer mit Datenbanken arbeitet.

Ich muss mich nun in eine fremde (nicht dokumentierte) DB (MSSQL) einarbeiten und hier ist es sehr praktisch.

Mir ist ewas aufgefallen:

  • Wenn ich Tables über Rechtsklick "Alphabetisch Sortieren" wähle, dann werden die Tabellen schön sortiert.
  • Wenn ich nun diese Baumansicht drucken möchte ("Datenquellen-Struktur drucken"), verliert er die Reihenfolge, d.h. im Ausdruck sind diese nicht mehr alphabetisch sortiert.
    wäre cool wenn Du dass bei dem nächsten Update mitmachen könntest

Nach ein paar Testversuchen erhalte ich nun eine Exception beim Drucken der Datenquellen-Struktur:

System.ArgumentNullException: Der Wert darf nicht NULL sein.
Parametername: value
bei TD.Additional.UI.WinForms.Forms.GenericEditor.set_Data(Object value)
bei TD.Additional.UI.WinForms.Printing.DefaultPrintDocumentSettingsForm.set_AdditionalSettings(Object value)
bei TD.Additional.UI.WinForms.Printing.PrintGdiDocument.ShowSettingsForm(Object additionalSettings)
bei DatabaseExplorer.Controls.ResultViewPanel.GetPrintDocument(ILog log, DefaultPrintDocumentSettings settings, Object additionalSettings)
bei DatabaseExplorer.MainForm.<>c__DisplayClass3c.<printDataSourceStructure_Click>b__3a(Object s1, EventArgs e1)
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Viele Grüße
Steffen

04.01.2013 - 11:53 Uhr

Hallo,

einen Thread mit Abort zu beenden ist immer unschön, den dadurch wird immer eine ThreadAbortException ausgelöst.

Sauberer ist es in der Thread-Routine nach einer Abbruchbedingung abzufragen (z.b. eine Bool-Variable).

hier noch ein Beispiel aus der MSDN:
Gewusst wie: Erstellen und Beenden von Threads (C#-Programmierhandbuch)

31.12.2012 - 00:52 Uhr

Hallo Pico,

wobei das lockObject dann außerhalb der Schleife deklariert sein muss.

Hast Du schon den Pinger versucht asynchron anzustoßen?
http://dotnet-snippets.de/dns/asynchrone-pingabfrage-ueber-pcs-in-der-domaine-SID1216.aspx

Ich habe soeben kurz angetestet, dort ist der Pinger kurz nach der Timeout-Zeit fertig...
Hier braucht man auch kein parallele Schleife mehr...

30.12.2012 - 16:05 Uhr

Hallo Pico1184,

ich würde es so machen:


public static IEnumerable<Connectors> BrowseConnector(string ipAdress)
        {
            var ipSub = ipAdress.Split('.');
            var connectors = new List<Connectors>();
            var localIpSubstring = String.Join(".", ipSub, 0, 3);

            Parallel.For(1, 255, i =>
                {
                    var nextIp = String.Concat(localIpSubstring, ".", Convert.ToString(i));

                    if (IpScanner.Ping(nextIp, 1, 500))
                    {
                    	var tempConfig = new PLCConnectionConfiguration("tempConfig" + i);
                    	var tempConn = new PLCConnection(tempConfig);
                        tempConfig.CpuIP = nextIp;
                        Console.WriteLine("Found " + nextIp);
                        try
                        {
                            tempConn.Connect();
                            var connector = new Connectors { RemoteName = nextIp };
                            lock (connectors)
                            {
                            	connectors.Add(connector);
                            }
                            tempConn.Disconnect();
                        }
                        catch (Exception)
                        {
                            Console.WriteLine(nextIp + " isn't a PLC");
                        }
                    }

                );
            return connectors;
        }

bei der If-Abrage war das Return nicht angebracht, dies beendet die schleifen komplett... und wenn du diese temporäre Objekte nur anlegt wenn ping erfolgreich ist, dann dauert es evtl. nicht mehr soo lange...
Bei connectors.Add muss dieser Aufruf synchronisiert werden, damit die Liste nicht von mehreren Threads gleichzeitig verändert werden kann.

Evtl. würde es auch was bringen wenn du die Anzahl der Threads erhöhst da die meiste Zeit der Ping-Timeout benötigt:
http://msdn.microsoft.com/de-de/library/system.threading.threadpool.setmaxthreads%28v=VS.80%29.aspx

30.12.2012 - 15:20 Uhr

Hi Rr.Roboto,

  • Man muss in solchen Fällen eine explizite Typeuntersuchung und -umwandlung durchführen, einen "allgemeinen" Weg gibt es nicht.

Kommt drauf an, wir haben hier keine Glaskugel. Ich setze ungern objects ein, da diese ja alle möglichen Typen enthalten können... Warum musst du alles auf objects aufbauen?

schöner ist es wenn man die Methode überladen tut:


		public static string ArrayToFormatedString(byte[] btArray)
		{
			string sRet = "";
			for (int i = 0; i < btArray.Length; i++) {
				sRet += btArray[i].ToString("X2");
				if (i <= btArray.Length) 
					sRet += " ";
			}				
			return sRet;
		}
		
		
		public static string ArrayToFormatedString(int[] iArray)
		{
			string sRet = "";
			for (int i = 0; i < iArray.Length; i++) {
				sRet += iArray[i].ToString("X4");
				if (i <= iArray.Length) 
					sRet += " ";
			}	
			return sRet;
		}

Gruß
Steffen

30.12.2012 - 15:05 Uhr

Hallo,

so in der Art kannst Du den Typ abfragen und dein String formatieren wie Du es haben willst...



namespace TestConsole
{
	class Program
	{
		public static void Main(string[] args)
		{
			byte[] btArray = new byte[]{
				0x0A, 0x01, 0x02, 0x05, 0x1B, 0x3C, 0x32, 0x5C, 0x34, 0x13, 0xCC, 0x7B};
			
			int[] iArray = new int[]{
				0x0A, 0x01, 0x02, 0x05, 0x1B, 0x3C, 0x32, 0x5C, 0x34, 0x13, 0xCC, 0x7B};
			
			string sRet = ArrayToFormatedString(btArray);
			Console.WriteLine("Byte Array formated: " + sRet);
			
			sRet = ArrayToFormatedString(iArray);
			Console.WriteLine("Int Array formated: " + sRet);
						
			Console.Write("Press any key to continue . . . ");
			Console.ReadKey(true);
			
		}
		
		public static string ArrayToFormatedString(object array)
		{
			string sRet = "";
			if (array is byte[])
			{
				byte[] btArray = array as byte[];
				
				for (int i = 0; i < btArray.Length; i++) {
					sRet += btArray[i].ToString("X2");
					if (i <= btArray.Length) 
						sRet += " ";
				}				
			}
			else if (array is int[])
			{
				int[] iArray = array as int[];
				
				for (int i = 0; i < iArray.Length; i++) {
					sRet += iArray[i].ToString("X4");
					if (i <= iArray.Length) 
						sRet += " ";
				}	
				
			}
			else if (array is uint[])
			{
				
				
			}
			return sRet;
		}
	}
}
22.11.2012 - 18:10 Uhr

Hallo PlooserX,

auf welches Interval ist dein Timer1 eingestellt?
Sendet der Motor die Daten nachdem Du "PF" geschickt hast?

evtl. bringt es was wenn du statt "Invoke" => "BeginInvoke" verwendest... wobei dann kann es passieren dass du einen Wert verpasst...

Im DataReceived solltest die Daten per ReadExisting einlesen, nicht dass nach dem ReadLine immer noch Daten im Puffer stehen...
SerialPort.DataReceived-Ereignis

Grüße
Steffen

06.09.2012 - 11:43 Uhr

Hallo,

mit fester IP-Adresse fährst du bei einem Server sehr schlecht da der Benutzer ja die IP verändern kann....

Desweiteren kann es vorkommen dass ein Rechner mehrere Netzwerkkarten hat...

Beispiel FTP-Server soll ja auf Port 21 reagieren egal von welchem Netzwerk => Also IPAdress.Any

05.09.2012 - 16:32 Uhr

Hallo,

sind es reine .Net-Controls in deinem Usercontrol?

Falls ja, könnte ich mir folgendes Konstrukt vorstellen:

  • Im Konstructor des UserControls registrierst du das LostFocus-Event von den drei Controls
  • Im diesem Ereignis (kann die gleiche Methode sein) prüfst du dann mittels Control.Focused ob eines der drei Controls den Focus besitzt wenn nein dann feuerst du LostFocus von deinem UserControl...

Falls es nicht klappt, so poste doch mal ein Beispiel-Code!

Grüße
Steffen

17.08.2012 - 11:07 Uhr

ich hätte vielleicht sagen sollen dass ich nicht so einfach auf .Net 4.5 updaten kann, dies wird von der genutzen Bibliothek nicht unterstützt.

Und wie es aussieht gibt es dieses "SustainedLowLatency" erst in der Version 4.5.

ich werde jetzt mal mit dem Profiler schauen ob ich irgendwelche ungünstige Stellen im Programm finde wo der Speicher nicht sofort freigegeben wird und somit der GC länger benötigt...

17.08.2012 - 10:16 Uhr

Hallo herbivore,

danke für deinen Hinweis.
Über diese Latenzmodis habe ich auch schon gelesen.
Allerdings denke ich nicht dass es hier das richtige ist, damit verschiebt man doch nur den GC-Lauf der dann unter Umständen erst die nächste Abarbeitung wieder abbremsen könnte...

Oder was passiert wenn gerade der GC aufräumt und ich in den anderen Threads den LatencyMode verstelle auf Low!? wird der GC dadurch sofort angehalten oder läuft dieser zu Ende und verzögert somit meine Auswertung?

17.08.2012 - 10:10 Uhr

Danke für die Beiträge!

@weismat:
Über dem Server-Mode vom GC habe ich auch gelesen, aber ist es nicht so dass dieser erst aktiviert werden kann, wenn man mehr als eine physikalische CPU hat?

The server GC is available only on multiprocessor computers. It creates a separate managed heap and thread for each processor and performs collections in parallel. During collection, all managed threads are paused (threads running native code are paused only when the native call returns). In this way, the server GC mode maximizes throughput (the number of requests per second) and improves performance as the number of processors increases. Performance especially shines on computers with four or more processors.

In dem PC ist ein i7-3930K (6x3,2Ghz) verbaut.

Vom Programm her wuerde ich klarer eine Boss/Work Crew Aufteilung machen. Das Zusammenfuehren sollte in einem eigenen Thread laufen, so dass die Work Crew nie wartet.

Dies werde ich überprüfen ob es machbar ist, die Zusammenführung auszulagern...

@GarlandGreene:
Die Auswertung muss nach 150ms fertig sein, da spätestens dann die Rückmeldung (Ergebnis) bekannt sein muss und weitergegeben werden soll. Sonst wird Ausschuß produziert wo kein Ausschuß ist...

17.08.2012 - 09:25 Uhr

Hallo Zusammen,

wir haben momentan ein größeres Problem mit unserem Programm.

Wir erhalten von außen alle 150ms drei Aufgaben diese Aufgaben werden getrennt voneinander abgearbeitet (parallel in verschiedenen Threads), zum Schluß führt der Thread der am längsten gebraucht hat, die Ergebnisse zusammen und gibt diese weiter.

Die Auswertung von einem Thread benötigt je nachdem zwischen 60ms bis 120ms.

Wenn die Anlage ideal läuft erhalten wir wie gesagt alle 150ms drei neue "Aufgaben". D.h. für den Garbage Collector bleibt hier relativ wenig Zeit.

Nun haben wir den Phänomen dass ein Thread ab und zu deutlich mehr Zeit benötigt, ich befürchte dass es auf den Garbage-Collector zurückzuführen ist.

Ich habe nun verschiedenste Sachen ausprobiert und komme so langsam nicht drauf wie man es lösen könnte!? Habe versucht nach jeder Auswertung den GC.Collect manuell aufzurufen (gen 2 und forced/optimized), hat nicht zum Erfolg geführt.

Eingesetzt wird Visual Studio 2010 (C#) mit .Net 4.0 auf einem Win7 x64 mit 16GB Ram.

Was ich im ProcessExplorer beobachtet habe dass der Speicherverbrauch von unserem Programm nur bis max 1,1 GB steigt und dann wieder abgebaut wird obwohl noch genug Speicher verfügbar ist. Natürlich braucht der GC dann deutlich länger je mehr Speichermüll sich angesammelt hat...

In .Net 4.0 wurde doch der GC optimiert sodass er die Threads nicht mehr anhält die die Objekte erstellt haben!? Muss man diese Funktion erst noch einstellen?

Hat nun jemand eine Idee wie man GC steuern sollte damit dieser die anderen Threads nich abbremst?

(Überall ein Dispose/Finalize aufzurufen ist nicht möglich da hier eine Bibliothek von Dritthersteller verwendet wird und diese wohl auch nicht sauber programmiert ist...)

Vielen Dank im Voraus für eure Ideen und Anregungen!

Gruß
Steffen

08.06.2012 - 16:56 Uhr

Hallo,

hier habe ich ein passendes Thread gefunden:

Keyboard Input

kurz gesagt, so wie "TheGear" gemeint hat, MouseDown und MouseUp abbonieren und merken welche tasten gedrückt sind.

Grüße
Steffen

09.05.2012 - 16:10 Uhr

Hallo Juli@,

wie hast du den das Crystal-Report erstellt?

Ich mache es immer so dass ich temporär das schema vom dataset abspeichere und dann in dem report diese xml als quelle angebe...


DataSet dsTemp = ....;
dsTemp.WriteXmlSchema("C:\\schema_dataset1.xsd");

und zur Laufzeit dann über


Protokoll1 rptReport = new Protokoll1();
rptReport.SetDataSource(dsTemp.Tables[0]);

die Quelle setze... ich habe meine Reports allerdings als eingebettete Resource...

Gruß
Steffen

08.05.2012 - 10:01 Uhr

Hallo,

ich habe es bei mir so gemacht:



        private void datagridview1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            if (datagridview1.CurrentCell is DataGridViewCheckBoxCell)
                datagridview1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }

Gruß
Steffen

08.05.2012 - 09:55 Uhr

Hallo,

ich schätze deine ID gehört in Hochkommas:


sql += "WHERE mandant_id=" + "'" + this.getMandantId().ToString() + "'";

17.04.2012 - 14:25 Uhr

Hallo,

ist es nicht bereits mit den Board-Mitteln von Visual Studio möglich?
Stichwort: Snippets
http://msdn.microsoft.com/en-us/library/ms165392%28v=vs.80%29.aspx

Grüße
Steffen

29.03.2012 - 15:55 Uhr

Hallo,

Multithreading bei Festplattenzugriffen macht recht wenig Sinn, da die Threads dann immer konkurrieren, weil die Festplatte ja nicht mehrere Dateien zur gleichen Zeit lesen kann...

An deiner Stelle würde ich es mit einem Backgroundworker machen (damit die GUI nicht einfriert) und du kannst dann auch noch evtl. Fortschrittsbalken anzeigen.

Gruß
Steffen

27.03.2012 - 16:41 Uhr

Hallo,

warum startest du nicht einfach selbst deine gewünschte Anzahl an Threads?

sowas:


Thread[] thThreads = new Thread[16];
for (int i = 0; i < thThreads.Length; i++ )
{
    thThreads[i] = new Thread(new ParameterizedThreadStart(MyThreadFunc));
    thThreads[i].Start(i);
}

private static void MyThreadFunc(object param)
{
   Console.WriteLine("Thread startet : " + param.ToString() + " " + DateTime.Now.ToString());
    Thread.Sleep(10000);
    Console.WriteLine("Thread beendet : " + param.ToString() + " " + DateTime.Now.ToString());
}

nun sollten die Thread relativ zeitgleich starten, wenn du die Thread 100% zeitgleich starten willst dann musst du noch ein ManualResetEvent in der ThreadFunc einbauen, welches nach der For-Schleife dann manuell gesetzt wird....

Aber vorsicht, die Threads laufen dann im Hintergrund, d.h. diese sind nach der For-Schleife nicht fertig!

Gruß
Steffen