Laden...
M
macke_a myCSharp.de - Member
Hardware / Software Entwickler Münsterland Dabei seit 07.12.2007 291 Beiträge
Benutzerbeschreibung

Forenbeiträge von macke_a Ingesamt 291 Beiträge

23.10.2008 - 12:00 Uhr

Erstmal Danke für Eure Antworten!

Da mir etwas die praktische Erfahrung mit dem Thema "Threads" fehlt versuche ich natürlich die beste Lösung für meine Programmierung zu finden. Ich benötige einen Thread der für meine Navigationssoftware eine Route im "Hintergrund" berechnet.
Je weiter die Distanz vom Start zum Zielort ist, desto länger ist der Thread beschäftigt. Die Zeit für Berechnung variiert zwischen drei und acht Sekunden.

Ursprünglich habe ich die Berechnung ohne Thread ausgeführt, diese führte aber zur Blockierung meiner grafischen Oberfläche!

Der zweite Programmierschritt war die Verlagerung in einen Thread, den ich mit einer while Schleife versehen hatte. Quasi der Thread läuft immer! Um die Route zu berechnen habe ich ein einfaches "Flag" gesetzt, damit er den API Call aufruft um die Koordinaten entgegen zu nehmen. Dieser "unschöne" Art der Programmierung veränlaßte häufig den Abbruch des Threads.

Jetzt habe ich einen Threadpool, immer wenn ich eine neue Route berechnen will, rufe ich meine Methode auf. Ist die Route berechnet, wird der Thread nicht mehr benötigt. Gibt es Probleme bei der Berechnung wird der Thread auch verlassen!

Bis jetzt habe ich noch keinen nennenswerten Probleme gehabt!

Mfg macke_a

23.10.2008 - 08:40 Uhr

Hallo winSharp93 !
Was heißt hier Overhead?
Der Programmieraufwand sollte immer so klein und effizient wie möglich sein!

Mfg macke_a

22.10.2008 - 16:58 Uhr

Hallo !

Wie programmiere ich einen Thread den ich ab und zu benötige, diesen aber nicht ständig in meinem Programm laufen lassen will.

Ich will diesen Thread bei Bedarf aufrufen und nutzen und anschließen wieder beenden.

Was wäre die beste Vorgehensweise bei der Programmierung?

Mfg macke_a

15.10.2008 - 10:37 Uhr

Hallo Ironbird,
danke für den Hinweis!

Ich habe das QwnLabel bei mir eingebaut - leider ohne Erfolg!! 😦

Die Aktualisierung der Textanzeige flackert immer noch in unregelmäßigen Abständen!!

Jemand noch ne Idee??

Gruss macke_a

14.10.2008 - 10:31 Uhr

Leider ergibt es sich keine wesentliche Verbesserung durch das auslagern des Labels in einem eigenen Thread:

public partial class Form1 : Form
{
        Thread worker; 
       
        public Form1()
        {
            InitializeComponent();

            worker = new Thread(Work);
            worker.Start();
        }

        private delegate void SetTime(int value); 
        public void SetAktTime(int value)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new SetTime(this.SetAktTime), new object[] { value });
            }
            else
            {
                this.SuspendLayout();
                TimeLabel.Text = DateTime.Now.ToString(); 
                this.ResumeLayout();
            }
        }

        private void Work()    
        {
            while (true)
            {
                SetAktTime(0x30);
            }
        }
}

Das Problem ist immer noch, das Label flackert in unregelmäßigen Abständen!

14.10.2008 - 08:47 Uhr

Ich lasse mir das aktuelle Datum mit der Uhrzeit anzeigen. Dabei ändert sich der Text für das Label im Sekundentakt
**
10/14/2008 8:40:48 AM**

Das flackern tritt auch unregelmäßig auf, manchmal erst nach 20Sekunden, manchmal nach 2Sekunden und dann mehrfach hintereinander.

Das einzigste was an meinem Monitorbild aktualisiert wird ist das Label, der Hintergrund bleibt unberührt. (Siehe Quelltext)

Die Zeit für die Aktualisierung habe ich auch 1000ms hoch gesetzt.

Was die Systemvoraussetzungen meiner Hardware betrifft, so habe ich einen PXA320 / 806MHz / 128MB RAM.

Das flackern ist auffällig und läßt sich auf einem 7"Monitor auch nicht wegreden!

Hmmh, aber wie ich das Problem jetzt löse ist eine gute Frage!

Jemand noch ne Idee??

Mfg macke_a

13.10.2008 - 17:47 Uhr

Hallo !
Ich habe ein Label auf meiner Form welches mir die aktuelle Uhrzeit anzeigt.
Jetzt nutze ich einen Timer der mir alle 500ms die Uhrzeit aktualisiert. => Siehe Quelltext

Leider habe ich trotz SuspendLayout & ResumeLayout immer noch flackern in unregelmäßigen Abständen auf meinem Monitor!
Jemand ne Idee was ich ändern könnte um das Problem zu beheben?

namespace TEST
{
    public partial class Form1 : Form
    {
        System.Windows.Forms.Timer timer2;  

        public Form1()
        {
            InitializeComponent();

            CurrentTime2(); 
        }

        public void CurrentTime2()
        {
            timer2 = new System.Windows.Forms.Timer();
            timer2.Interval = 500;
            timer2.Tick += delegate
            {
                this.SuspendLayout();
                TimeLabel.Text = DateTime.Now.ToString(); 
                this.ResumeLayout(); 
            };
            timer2.Enabled = true;
        }
   }  
}

Ich habe ausschließlich das Compact Framework V2.0 zur Verfügung.
Double Buffering steht mir leider nicht zur Verfügung!

Gruss macke_a

13.10.2008 - 09:18 Uhr

Hallo zero_x

Danke für den Link 🙂

Mfg macke_a

10.10.2008 - 14:05 Uhr

Hallo!

Ich möchte gerne eine Batch-Datei auf meinem Windows CE Rechner haben.
Diese soll eine Fallabfrage zwischen zwei Programmen machen, falls die eine Software nicht vorhanden ist, dann nutze diese - ansonsten die andere.

Kann mir jemand schreiben, ob dies genau so wie unter Windows XP funktioniert?

Oder werden Batch-Dateien von Windows CE nicht unterstützt?

Wäre nett 🙂 Danke

Mfg macke_a

10.10.2008 - 08:25 Uhr

Hallo !

Ich suche Informationen zum Thema Databinding.
Wozu ist diese Funktion hilfreich? Was kann ich erreichen, wenn ich diese Funktion in meinem Programm verwende?

Kleine Beispiele oder hilfreiche Links wären nett!

Besten Dank!!

Mfg macke_a

09.10.2008 - 15:42 Uhr

Danke für Eure Antworten 🙂

Besteht eventuell die Möglichkeit, die Aktualisierung mit Databinding zu verbinden?
Spricht etwas gegen diese Lösung um mit INotifyPropertyChanged zu arbeiten ?

Na klar, ich kann einen Timer aufziehen, der mir die Zeit aktualisiert - das wäre die einfachste Lösung.

Allerdings versuche meinen Quelltext zu verbessern, indem ich etwas mehr Intelligenz in meine Programmierung bringe. Der Teil mit der Uhrzeit ist nur ein kleiner Ausschnitt aus meinem Programm. Insgesamt habe ich ca. 2000Zeilen C# Code, ca. 60 grafische Buttons, 7Anzeige Felder usw... die ich alle Händeln muss.

Jetzt überlege ich Databinding einzusetzen um die Programmierung etwas übersichtlicher und einfacher zu gestalten. Spricht da etwas gegen?

Naja, C# habe ich nie gelernt - Try & Error - und somit versuche ich meinem Programmierstil irgendwie zu verbessern!

Gruss macke_a

09.10.2008 - 14:37 Uhr

Hallo !
Ich benötige mal Eure Hilfe bei der Programmierung. Ich möchte mir das Datum und die Uhrzeit auf meiner Form anzeigen lassen und nutze dabei den folgenden Sourcecode, der auch einwandfrei funktioniert.

namespace CBPLAY
{
    public partial class AREA1 : Form
    {
        CurrentTime TiDa = new CurrentTime(); 

        public AREA1()
        {
            InitializeComponent();

            TimeLabel.Text = TiDa.Now.ToString();   
        }

        public class CurrentTime : INotifyPropertyChanged
        {
            System.Windows.Forms.Timer timer;

            public CurrentTime()
            {
                timer = new System.Windows.Forms.Timer();
                timer.Interval = 1000;
                timer.Tick += delegate { this.Now = DateTime.Now; };
                timer.Enabled = true;
            }

            private DateTime date = DateTime.Now;

            public DateTime Now
            {
                get { return date; }
                private set
                {
                    if (date != value)
                    {
                        date = value;
                        OnPropertyChanged("Now");
                    }
                }
            }

            public event PropertyChangedEventHandler PropertyChanged;

            protected virtual void OnPropertyChanged(string propertyName)
            {
                OnPropertyChanged(new PropertyChangedEventArgs(propertyName));

            }

            protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
            {
                if (null != PropertyChanged)
                {
                    PropertyChanged(this, e);
                }
            }
        }
    }
}

Jetzt wird die Uhrzeit und das Datum exakt einmal angezeigt und entsprechend meiner Programmierung nicht mehr aktualisiert. Ich will aber das sich die Uhrzeit im Minuten Takt verändert.

Jetzt gibt es die Möglichkeit einen Timer für diesen Sourcecode zu verwenden um das Problem zu lösen.


TimeLabel.Text = TiDa.Now.ToString();   

Allerdings habe ich schon einen Timer in der Klasse CurrentTime. Einen zweiten will ich nicht, es sei denn es geht nicht anders!

Ich suche nach einem Programmiervorschlag, der mir eine andere Möglichkeit zeigt, wie ich die Aktualisierung der Uhrzeit programmieren kann.

Kann mir jemand weiterhelfen?

Gruss macke_a

07.10.2008 - 13:30 Uhr

Hallo !
Kann mir jemand einen Hinweis geben, wo ich die Lizenz Unterschiede zwischen dem WinCE Core, der WinCE Professional und der WinCE Professional Plus Version finde?

Eine tabellarische Aufstellung wäre natürlich das beste!

Ich suche Information zu den einzelnen Lizenzen und wo die exakten Unterschiede der drei WinCE Versionen liegen.

Besten Dank im Voraus!

Mfg macke_a

25.09.2008 - 14:54 Uhr

Hallo kleines_eichhoernchen !

Gesagt getan...
Ich habe eine Ausgabe auf meiner seriellen Schnittstelle vor dem

CApplicationAPI.BringApplicationToBackground();

und direkt nach dem Aufruf.

Irgendwann so nach ein paar Durchläufen (30 ~ 50mal) bekomme ich noch eine Ausgabe vor dem API Call und unmittelbar nach dem API Call keine Ausgabe mehr!

Dieser "API CALL" - Aufruf "zerdonnert" meinen Thread!
Aber ich wüsste nicht wie ich das abfangen kann.

Der Aufruf hat auch einen Rückgabewert, den ich mir auf der seriellen ausgebe und dieser Wert ist auch in Ordnung!

ControlBack = CApplicationAPI.BringApplicationToBackground();

Wie beschrieben, irgendwann nach dem Aufruf bekomme ich keine Ausgabe mehr und kann somit nicht beurteilen wo der Fehler liegt!

Dieser Thread "BlankSygicOut" wird zerstört und mein restliches Programm läuft ohne Fehler weiter!

Wie soll man das verstehen ?

25.09.2008 - 14:22 Uhr

Hallo !

@herbivore - Danke für den Link [Semaphore / Ampel] !
Das Prinzip ist verstanden 🙂

Ich habe einmal versucht, obwohl es wirklich nicht die ideale Art der Programmierung ist, den Quelltext (Ausschnitt) folgender Maßen aufzubauen.


SygicBlank = new Thread(BlankSygicOut);
SygicBlank.Start();

private void BlankSygicOut()
{
  while (true)
  {
      if (SygicBlankes == 1)
      {
        try
        {
           CApplicationAPI.BringApplicationToBackground();
           SygicBlankes = 0;
         }
         catch(Exception)
         { }
       }

      Thread.Sleep(500);
  }
}

Ach das abfangen einer Exception hat nicht den Erfolg gebracht, das der Thread mitten im Programm abgebrochen wird, zu verbessern.

Ich vermute mal, dass die Ursache stark bei dem Thread.Sleep(500) oder bei der while(True) Schleife liegt. Kann denn einer diese beiden Funktion einen Thread zum beenden zwingen ? Aus welchen Gründen?

24.09.2008 - 15:59 Uhr

Hallo !
Ich habe mir das ManaualResetEvent Ereignis angeschaut und habe so doch noch ein zwei Fragen die mich beschäftigen.

Soweit ich das verstanden habe, erzeuge ich ein Objekt

ManualResetEvent signal = new ManualResetEvent(false);

Mein Programm welches ich mehrfach aufrufen will schreibe ich in einen ThreadPool

ThreadPool.QueueUserWorkItem( new WaitCallback(BlankSygicOut), signal)

Und anschließend nutzte ich signal.WaitOne() - Thread blockiert und
signal.Set() - zum auslösen des Events.

Ist das so einigermaßen richtig beschrieben? Ich bin mir nioht sicher, ob der Ablauf so richtig ist?

24.09.2008 - 13:00 Uhr

@kleines Eichhoernchen

Nein, ich starte den Thread nur einmal. Er läuft doch in der while Schleife und sobald ich die Funktion benötige setze ich den Integer SygicBlankes auf "1".

24.09.2008 - 12:15 Uhr

Hallo!
Ich habe einen Thread, der den folgenden Programm Inhalt hat:



SygicBlank = new Thread(BlankSygicOut); 
SygicBlank.Start(); 


private void BlankSygicOut()   
{
  while (true)
  {
      if (SygicBlankes == 1)
      {
         CApplicationAPI.BringApplicationToBackground(); 
         SygicBlankes = 0; 
       }

      Thread.Sleep(500); 
  }
}

Diesen Thread starte ich sobald mein Programm läuft. Bei Bedarf setze ich den Integer Wert SygicBlankes auf 1, damit er meine Funktion "CApplicationAPI.BringApplicationToBackground()" ausführt und das Bild einer Navigationssoftware in den Hintergrund bringt.

Dieser Thread arbeitet eine gewisse Zeit einwandfrei. Ich rufe Ihn ca. 30 ~ 50mal auf.
Allerdings passiert es, dass der Thread sich von alle beendet!
Wie kann so etwas passieren? Vermutlich liegt ein Fehlerfall bei meiner Funktion vor, dieser sollte aber trotzdem nicht zum beenden meines Threads führen.

Kann mir jemand weiterhelfen, wie ich das Problem in den Griff kriegen kann?
Muss ich meine Programmierung ändern?

Gruss macke_a

18.09.2008 - 11:11 Uhr

Hallo...

Folgendes Problem:
Es kommt bei meiner graphischen Oberfläche hin und wieder folgendes Fehlverhalten vor.

Sobald ich einen Button drücke, wird es mir durch die veränderter Hintergrundfarbe sichtbar gemacht. Dabei passiert es, dass er die Hintergrundfarbe anzeigt, diese aber beim loslassen des Buttons trotzdem behält!!

Jetzt könnte man das wieder auf das Thema "Blockierung in der GUI" zurückführen.

Allerdings bin ich mir nicht sicher, ob es daran liegt! Mein Programm läuft ohne Probleme und es werden keine anderen Programmteile aus meiner Sicht blockiert!

Gibt es jemanden der ne Lösung für das Problem oder eine Anregung hat?

Gruss macke_a

24.08.2008 - 13:58 Uhr

Hallo ErfinderDesRades,
auch Dir Danke für den Beitrag 🙂

Ich verändere meine Software ständig mit der Thread Programmierung und versuche alle Eure Hinweise mit zu berücksichtigen...

Mal sehen was für ein Ergebnis ich bis heute Abend programmiert bekomme..

Ein paar Fragen kommen bestimmt noch hoch, aktuell beschäftigt mich noch das folgende, welche ich mit herbivore auch schon einmal angeschnitten hatte. Aber für mal eben heute schnell programmieren, fehlt mir etwas die Zeit mir die Materie anzulesen bzw. dieses auch "mal eben" zu verstehen. Vielleicht hat jemand nen schnelle Antwort parat.

Es geht dabei um einen Thread außerhalb meiner GUI, der immer die selbe Aufgabe erledigen muss, allerdings mit unterschiedlichen Parametern.

Thema: Navigationssoftware
Ich muss eine Route berechnen lassen, die während dessen meine GUI blockiert.
Um diese Berechnung außerhalb meiner GUI zu handeln, will ich einen Thread haben, dem ich unterschiedlichen Koordinaten übergeben kann. herbivore hat mir einen Link "Applikation mit der Warteschlange" gezeigt. Wie funktioniert das Prinzip, öffne ich jedes mal einen neuen Thread bei einer neuen Route? Ich kann einen Thread doch nur einmal starten, da muss ich doch schon jedesmal den Thread auch wieder beenden, oder?

Theoretisch brauche ich einen Thread, den ich x-mal aufrufen kann.

Gruss macke_a

24.08.2008 - 12:05 Uhr

Richtig herbivore !
Ich versuche gerade das Ziel zu verwirklichen bzw. ich lasse meinen heiligen Sonntag heute einmal sausen und sitze gerade im Büro.

Nächste Woche Donnerstag ist Abgabetermin, bis dahin muss das Projekt stehen bzw. mein Programm einigermaßen arbeiten!

24.08.2008 - 11:51 Uhr

Hallo herbivore,
das Windows keine Echtzeitsystem ist weis ich - trotzdem Danke für den Hinweis 🙂

24.08.2008 - 09:42 Uhr

Hallo Erfinder des Rades...

Nee ist liegt mit einer sehr hohen Wahrscheinlichkeit an meiner Software.

Ich bekomme ein Telegramm und muss innerhalb von 100ms eine Quittung senden, schaffe ich es nicht zu quittieren, so wird das Telegramm bis zu 5mal wiederholt.

Leider kommt es je nach Blockierung meiner Software vor, dass ich frühestens nach 250ms antworten kann.

Das Empfangstelegramm, welches von der seriellen Schnittstelle kommt, hat sieben Byte und ich muss nur ein Byte als Quittung senden.

Im Prinzip schaffe ich das senden innerhalb von 1 - 16ms Sekunden, aber ich benötige durch die Blockierung auch mal eine 10 - bis 20fache Zeit!

Von daher muss ich meine Programmierung auf den Kopf stellen und ausgiebiger mit der Threads arbeiten.

Jetzt schaue ich mir erstmal den Artikel von michlG an 🙂

Gruss macke_a

23.08.2008 - 19:45 Uhr

Hallo Ihr beiden !
Danke für Eure ausführlichen Beiträge und die tatkräftige Unterstützung!

Schönes Wochenende noch 🙂

Gruss macke_a

23.08.2008 - 18:14 Uhr

Hallo!

der Code, der die 300ms wartet, darf nicht im GUI-Thread laufen

Da ich leider immer noch Blockierungen in meiner GUI habe, muss ich noch
zwei weitere Fragen zu diesem Thema geklärt haben.

1)
Soweit mir bekannt ist, gibt es zwei Möglichkeiten, einen Code aufzurufen der außerhalb der GUI arbeitet.
Zum einen Funktionen mit einem delegate aufzurufen und zum anderen einen System.Windows.Forms.Timer zu nutzen.
Um prinzipielle Blockierungen in der GUI zu verhindern, wäre es doch clever jeder Funktion außerhalb der GUI zu betreiben, oder?

2)
Wie ist das handling eines grafischen Buttons, mit der Funktion Button_Click -Methode? Soll man dort auch sämtliche Funktionen in einem delegate auslagern, solange dies keine langen Berechnungen sind?

Freue mich auf Eure praktisch erprobten Antworten...

Gruss macke_a

21.08.2008 - 16:22 Uhr

Warum...300ms ?
Es gibt noch eine Luftschnittstelle via 4m-Funk, zwei weitere Hardwarekomponenten durch die diese Information gesendet werden muss und deshalb wird eine Verzögerung von 300mS hervorgerufen, bis der Text an meinem Endgerät ist.

21.08.2008 - 15:56 Uhr

Es geht nicht um 1000mal in der Sekunde, sondern wenn ich durch ein Menü zappe, indem es 40 Unterpunkte gibt. Ich benötige ca. 300ms um von einem zum nächsten Menüpunkt springe. Diese Aktion führe ich drei oder viermal, von oben nach unten, durchs Menü aus und irgendwann kommt der Effekt das meine GUI hängt.

Ich kann natürlich auch einen Timer aufziehen der mir in einem 300ms Intervall die Textbox aktualisiert, aber ob das der richtige Ansatz ist?

Laut den Recherchen von mir, wäre der ThreadPool.QueueUserWorkItem ein gute Alternative, dass blockieren meiner GUI zu verhindern. Andersrum solange programmiere ich auch noch nicht unter C#, da lasse ich mich lieber noch einmal von Euch belehren !

Vielen Dank für Eure Unterstützung!

Gruss macke_a

PS: Die Sache mit dem Timer probiere ich jetzt aus!!

21.08.2008 - 14:58 Uhr

Danke für Eure Beiträge.

So richtig habe ich noch nicht den Durchblick wie ich mein Problem löse kann, trotz des Links von herbivore. Allerdings kann es sein das ich das folgende Thema mir etwas näher anschauen sollte? "ThreadPool.QueueUserWorkItem"

Das würde im Endeffekt bedeuten, das alle meine neue Texte die ich in der Textbox darstellen möchte in die Queue gelangen und diese anschließend "synchron" hintereinander abgearbeitet werden.

Sehe ich dies Richtig, oder gibt es Einwände?

Gruss macke_a

21.08.2008 - 12:27 Uhr

Die GUI blockiert, der Rest des Programmes natürlich auch - um einen Reset meiner Anwendung komme ich nicht mehr drumherum!

Es wäre im Hauptprogramm besser den folgenden Aufruf zu verwenden.

SetKurzText(ByteArrayToString(datatgr, 7, len - 7))
  public delegate void SetTextKurzText(string KurzText);
  
  public void SetKurzText(string KurzText)
  {
      if (this.TextBox.InvokeRequired)
      {
          SetTextKurzText Set = new SetTextKurzText(SetKurzText);
          this.Invoke(Set, new object[] { KurzText });
      }
      else
      {
         TextBox.Text = KurzText;       
      }
  }

Allerdings ergeben sich mit dieser Programmierung die selben Probleme.
Ein delegate arbeitet synchron, was doch wiederum zu einer gewissen Wartezeit führt und mein GUI trotzdem wieder für eine gewisse Zeit steht?

Wie soll man das denn richtig programmieren ? Ne Idee?

Gruss macke_a

21.08.2008 - 11:59 Uhr

Ich nutze in meinem Programm eine Textbox, die in einen realtiven kurzen Abstand von ca. 300ms mit neuen Texten versorgt wird. Ich rufe in meinem Hauptprogramm das

BeginInvoke(new SetTextKurzText(SetKurzText), ByteArrayToString(datatgr, 7, len - 7)); 

auf.

Hinweis: datatgr ist ein Byte Array mit den Nutzdaten, ab der Stelle 7 im Array

Jetzt kommt es bei über 50 Aufrufen vor, das mein GUI blokiert und ich mein Programm neu starten muss! Eigentlich bin ich mir sicher das alle relevanten Details "GUI blockiert nicht" zur Akutalisierung der Textbox berücksichtigt habe.

Hier der Codeausschnitt:


  public delegate void SetTextKurzText(string KurzText);
  
  public void SetKurzText(string KurzText)
  {
      if (this.TextBox.InvokeRequired)
      {
          SetTextKurzText Set = new SetTextKurzText(SetKurzText);
          this.Invoke(Set, new object[] { KurzText });
      }
      else
      {
         TextBox.Text = KurzText;       
      }
  }

Trotzdem passiert dieser Vorfall regelmäßig das die GUI blockiert! Leider sehe noch keinen Ausweg, wie ich das Problem lösen kann! Was mache ich falsch in meiner Programmierung?

Danke für Eure Antworten!

Gruss macke_a

20.08.2008 - 17:49 Uhr

Danke für den Beitrag...

Wäre es nicht sinnvoller eine asynchrone Abarbeitung der Threads durchzuführen?
Ich lasse maximal eine Route berechnen und sobald eine neuer Zielort kommt, wird der alte Route gelöscht.

Gibt es denn nicht eine andere Lösung, außer die "Applikation mit der Warteschlange" ??

Besteht denn nicht die Möglichkeit, den Thread zu beenden und diesen anschließend wieder zu starten bzw. diesen mit neuen Daten zu versorgen?

Gruss macke_a

19.08.2008 - 18:34 Uhr

Ich habe die Veränderungen in meinem Quelltext vorgenommen und es ergeben sich deutliche Verbesserungen!!!

Es gibt aber noch eine Sache, da benötige ich noch einmal einen kleinen Denkanstoß.

Ich habe einen Thread definiert und benötige deren Funktion mehrfach um ein Routing zu starten.

public Thread ApiC = new Thread(new ThreadStart(ThreadC));
public void ThreadC() { /* starte Routing */ }

Dieser Thread wird gestartet , wenn ich eine Route berechne mit

ApiC.Start(); 

in meinem Programm.

Jetzt nutze ich den selben Thread, bei neuen Koordinaten um ein anderes Ziel zu routen, wieder.

Das Problem ist aber, eigentlich musste ich den Thread beenden und wieder von neuem starten. Das erscheint mir aber nicht als sinnvolle Lösung!

Was gibt es denn für Programmiermöglichkeiten wenn ein Thread mehrfach, aber mit unterschiedlichen Parametern genutzt werden soll?

Gruss macke_a

19.08.2008 - 09:39 Uhr

Danke für die Beiträge und die Links von Euch. Ich möchte trotzdem noch einmal darlegen, wie ich meine Programmierung aufgebaut habe.


using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ThreadStarten
{
    static class Program
    {
        [MTAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    }
} 

Alle meine Steuerelemente und das starten der Navigationssoftware befinden sich im Form1. Bis jetzt habe ich auf das einbinden von Control.Invoke bei Steuerelementen, außer bei einem Delegate-Aufruf verzichtet.

Der erste Weg zur Verbesserung meiner Software wäre vermutlich, dass das Starten der Navigationssoftware (navi.exe - Anwendung) außerhalb meiner Form1. Richtig?
Diesen Teil müsste ich demnach in meinem mitgelieferten Programmteil als zweiten Thread starten.

Der zweite Schritt wäre, den Aufruf Control.InvokeRequired bei meinen Steuerelementen mit einzubinden.

Das musste doch ein richtiger Anfang sein, oder?

Gruss macke_a

18.08.2008 - 20:30 Uhr

Danke für den Beitrag. Eine prinzipielle Frage bleibt mir allerdings noch offen, was die Programmierung mit C# betrifft.

Ist es denn sinnvoll die Programmteile in mehrere Threads zu fassen? Muss ich von Grund auf diese Beziehung einhalten?

Bis jetzt habe ich meine Programme ohne Threads geschrieben. Dabei habe ich eine grafische Oberfläche auf einem 7" Monitor dargestellt. Bei jedem Button Druck löse ich ein Ereignis aus. Da ich aber jetzt mit einer Navigationssoftware arbeite benötige ich wesentlich mehr Ressourcen, die wiederum andere Programmteile für einen kurzen Augenblick in der Hintergrund stellt.

Ohne die Threadprogrammierung werde ich wohl nicht mehr auskommen, oder seht ihr da andere Möglichkeiten!?

Wäre nett, wenn ich zu dem Thema noch ein paar Feedbacks erhalten könnte!

Gruss macke_a

17.08.2008 - 13:41 Uhr

Hallo bluedraggon,
danke für den Beitrag.

Wie ich bereits vermut habe ist eine Thread Programmierung von nöten um eine korrekte Abarbeitung meiner Programmierung zu gewährleisten. Demmach müßte ich meine Programmstruktur von Grund auf ändern, um solche Performance Probleme in den Griff zu kriegen.

Sehe ich das richtig?

Gruss macke_a

17.08.2008 - 12:32 Uhr

Ich habe einen WinCE Embedded Rechner (806MHz, 128MB RAM) auf dem primär ein Prozess mit zwei unterschiedlichen Aufgaben laufen. Zum einem muss ich die Kommunikation mit einer externen Hardware aufrecht halten, indem ich auf Anfrage der Gegenstelle alle 100ms über die serielle Schnittstelle ein Telegramm sende und zum anderen eine Navigationssoftware deren Informationen auf einem 7" Monitor dargestellt wird.

Jetzt habe ich das folgende Problem:
Sobald ich eine Route mit der Navigationssoftware berechnen lasse, bin ich nicht mehr in der Lage empfangene Telegramme, für die Berechnungszeit der Route von ca. 4Sekunden, auszuwerten.

Die Navigationssoftware "klaut" mir die Ressourcen in meinem Prozess, sodass ich überhaupt nicht mehr auf empfangene Telegramme reagieren kann. Ich bekomme vom Betriebssystem keine Rückmeldung, dass Daten auf der seriellen Schnittstelle empfangen worden sind!

Ich habe das Programm mit der ich die serielle Schnittstelle und die Navigationssoftware starte "einfach herunter" geschreiben. Thread Programmierung und die Vergabe von Prioritäten habe ich nicht beachtet.

Was müßte ich vom Prinzip der Programmierung ändern, dass wenn eine Route berechnet wird, ich noch Telegramme auswerten und beantworten kann. Ich suche nach Möglichkeiten um den Fehler zu beheben. Schließlich kann ich dem Betriebssystem doch vorgeben, welche Aufgabe höhere Prioritäten habe als andere. Die Berechnung der Route kann ich auch auch 7Sekunden dauern, wenn ich dafür in der Lage bin, die seriellen Telegramm auszuwerten.

Ich freue mich auf Antworten und werde auch auf direkte Fragen von Euch eingehen!

Vielen Dank für Eure Bemühungen!

Gruss macke_a

23.06.2008 - 15:33 Uhr

Hallo !
Für mein aktuelles Programm in Visual Studio versuche ich gerade herauszufinden wie ich am besten meine Software, bei Aktualisierung bzw. bei Erweiterung von neuen Quelltexten, eine fortlaufende Nummer zuteilen kann.

Im Moment habe ich mein Programm mit TestVS0001.exe genannt. Jetzt habe ich eine Erweiterung und will aufgrund der Änderung das Programm in TestVS0002.exe umbenennen.

Wie und was muss ich in Visual Studio ändern, sodass ich beide Versionen noch zur Verfügung habe? Geht das Überhaupt ohne ein neues Projekt zu erstellen?

Hat jemand eine Hinweis für mich ?

Gruss macke_a

19.06.2008 - 08:30 Uhr

Hallo Erfinder des Rades!

Gerne produziere ich den Fehler erneut um mir die Möglichkeiten zu schaffen, die Fehler in Zukunft selber zu beheben!

Ich bin quasi den ganzen Tag "online" von daher können wir beide später noch einmal über das Problem diskutieren...

Gruss macke_a

18.06.2008 - 11:16 Uhr

PROBLEM GELÖST !!

Der Quelltext von xxxprod hat den gewünschten Erfolg für meine Programmierung gebracht. Ich muss jetzt nur noch die Funktionen, die ich eben als zweitrangig angegeben habe, verbessern.

Danke für Eure Beiträge!!

Gruss macke_a

18.06.2008 - 10:42 Uhr

Natürlich kann ich Dir sagen wo der Fehler auftritt...und zwar in dieser Zeile

ListBoxEb3.Items.Insert(i, obj);

Der Sinn der Funktion ist auch erstmal zweitrangig....

18.06.2008 - 09:35 Uhr

Hallo !
Ich habe versucht den Fehler zu lokalisieren., leider ohne nennenswerten Erfolg. Auch durch weiter Recherchen komme ich zu keinem Ergebnis. Wie beschrieben sieht mein aktueller Quelltext so aus.


private void ListBoxUp_MouseUp(object sender, MouseEventArgs e)
{           
            int i = ListBoxEb3.SelectedIndex;

            object obj = ListBoxEb3.Items[ListBoxEb3.SelectedIndex]; 

            ListBoxEb3.Items.RemoveAt(i);
            ListBoxEb3.Items.Insert(i, obj);
            ListBoxEb3.SelectedIndex = i;
}

Die Fehlermeldung ist bereits von mir beschrieben worden. Sollte jemand von Euch, den Fehler unmittelbar sehen, so wäre ich für ein kurzes Feedback dankbar!

Gruss macke_a ... und besten Dank !

17.06.2008 - 12:16 Uhr

Ja gut...der relevate Fehler ist wie folgt beschreiben:

Fehler CS1503: 2-Argument: kann nicht von "object" in "OpenNETCF.Windows.Forms.ListItem" konvertiert werden.

Nur ListItem steht mir auch nicht zur Verfügung, wie soll ich da denn eine Lösung finden ?
Oder seh ich mittlerweile den Wald vor lauter Bäume nicht mehr ???

17.06.2008 - 11:07 Uhr

Hallo !

Die Idee hatte ich auch schon, danke für den Hinweis!

    

private void ListBoxUp_MouseUp(object sender, MouseEventArgs e)
{        
   int i = ListBoxEb3.SelectedIndex;

   Object obj = ListBoxEb3.Items[ListBoxEb3.SelectedIndex]; 
   ListBoxEb3.Items.RemoveAt(i);
   ListBoxEb3.Items.Insert(i, obj);
} 

Allerdings erhalte ich dann immer noch die folgende Fehlermeldung:

Fehler CS1502: Die beste Übereinstimmung für die überladene OpenNETCF.Windows.Forms.ListBox2.ItemCollection.Insert(int, OpenNETCF.Windows.Forms.ListItem)-Methode hat einige ungültige Argumente.

Fehler CS1503: 2-Argument: kann nicht von "object" in "OpenNETCF.Windows.Forms.ListItem" konvertiert werden.

Was nun ?

17.06.2008 - 10:01 Uhr

Hallo !

Ich habe noch ein weiteres Problem mit meiner Listbox, da bei mir die SelectedItem Eigenschaft bei der Listbox nicht vorhanden ist. Ich nutzte das CompactFramework 2.0 / VisualStudo 2005 mit seinen vorhanden Bibliotheken, doch dort fehlt diese Eigenschaft.

 
 int i = ListBox.SelectedIndex;

 object obj = ListBox.SelectedItem; 

 ListBox.Items.RemoveAt(i);
 ListBox.Items.Insert(i, obj); 

Hat jemand einen Vorschlag wie ich diese Eigenschaft für meine Listbox bekommen kann?
Laut MSDN ist der folgende Namespace relevant, denn ich natürlich mit eingebunden habe, aber er die "SelectedItem" Eigenschaft nicht beinhaltet!

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in system.windows.forms.dll)

Kann mir jemand weiterhelfen, wie ich mein Problem lösen kann ?

Gruss macke_a

16.06.2008 - 11:00 Uhr

Hallo ErfinderDesRades,
ja ich will eine Endlos-Rund-Scroll-Schleife für meine Listbox haben..!

Ich versuche den Teil von Dir in mein Programm einzupflegen. Eventuell melde ich mich später noch einmal...

Gruss macke_a

16.06.2008 - 08:52 Uhr

Hallo !
Ich habe eine Listbox mit 21 Einträgen von denen nur 5 sichtbar sind.

Jetzt möchte ich die Reihenfolge in der Listbox ändern können um auch die nicht sichtbaren Einträge anzuzeigen.

Neben meiner Listbox befinden sich zwei Buttons, Up & Down die ich zum auswählen nutzen will.

Für die Programmierung suche ich jetzt eine gute Lösung wie ich am besten die Reihenfolge der Einträge verändern kann.

Dazu ein kleines Beispiel:
Ich habe Eintrag 0 - 4 sichtbar. Jetzt betätigt jemand den Up-Button, d.h. Eintrag 20,0,1,2 und 3 müssen angezeigt werden.

Sollte jemand den Down Button dreimal betätigen, so musste im aktuellen Beispiel die Einträge 1,2,3,4 und 5 angezeigt werden.

Kann mir jemand auf die Sprünge helfen, wie ich mein kleines Programm aufbauen soll? Wie würdet Ihr das lösen?

Besten Dank im Voraus!

Gruss macke_a

13.06.2008 - 14:14 Uhr

Der Ziffernblock besteht aus einzelnen Buttons! Die Buttons werden alle über das button clickevent Methode miteinander verbunden.

Somit mußte ich einen Rückgabewert bekommen!

Gruss macke_a

13.06.2008 - 11:56 Uhr

Hallo !
Ich habe ein Problem bei der Auswertung des folgenden Quelltextes...

private void button_Click(object sender, EventArgs e)
    {
        Button temp = sender as Button;
        if(temp != null)
        {
            foreach (Control c in this.Controls)
            {
                if (c is Button && c != temp)
                {
                    c.ForeColor = Color.Black;
                }
            }
            temp.ForeColor = Color.Red;
        }
    }

Den Ziffernblock ist mit der button clickevent methode verbunden.

Allerdings bekomme ich für temp immer eine Null als Rückgabewert zurück!
Ich habe es mit meinem Debugger mehrfach kontrolliert und es ist nicht möglich, einen anderem Rückgabewert zu bekommen.
Wie kann das denn sein? Jemand nen Vorschlag, woran diese liegen könnte?

Gruss macke_a

11.06.2008 - 14:18 Uhr

Hallo ! Danke für die Hinweise und natürlich habe ich gleich auch eine Frage.

Bei meiner Oberfläche nutze ich einen Ziffernblock (12 Tasten) die ich je nach Tastendruck mit einer roten Farbe kenntlich machen will. Jetzt betätige ich die Taste 1, d.h. diese Taste wird rot und soll den farblichen Zustand halten bis die nächste Taste gedrückt wird; alle anderen bleiben neutral.

Wird jetzt Taste 4 betätigt, so müssen alle anderen Tasten wieder neutral werden und die gedrückte hat wiederum die rote Farbe, usw.

Kann man so etwas mittels Databinding lösen ? Oder wird das zu komplex mit der Programmierung? Gibt es eine alternative Lösung ?

Gruss macke_a

11.06.2008 - 10:55 Uhr

Hallo !
Ich suche Informationen wie ich Steuerelemente mittels Datenbindung untereinander verknüpfen kann. Gibt es irgendwo im Möglichkeiten sich dieses Wissen anzulesen?

Ich programmiere zur Zeit eine Oberfläche und vermute das mir das Databinding so manche Software-Arbeit ersparen kann. Wie funktioniert das Prinzip und was für Möglichkeiten habe ich...

Fragen über Fragen, jetzt suche ich die passenden Antworten!
Kann mir jemand weiterhelfen?

Gruss macke_a