Laden...

Forenbeiträge von all-finder Ingesamt 30 Beiträge

11.04.2011 - 14:04 Uhr

Hallo beisammen!

Wir entwickeln unsere Projekte in C für verschiedene Zielplattformen. Um ein Laufzeitsystem zu emulieren würden wir unser C-Projekt in einer C#-Desktop Umgebung einbetten (wollen). D.h. die HW-Schicht und Ein/Ausgabe würden wir uns emulieren (in C#), die Applikation wird in C (unverändert) eingebettet.

Hat das schon mal jemand gemacht? Kann ich in einer Projektmappe ein C-Projekt (z.B. als dll) in mein C#-Projekt einbinden und Compilerübergreifend debuggen? Oder steht mir dies nur per C und C++ per Visual Studio zur Verfügung?

Grüße,

12.07.2010 - 08:15 Uhr

gibt es eine Möglichkeit dies abzubrechen? Nach dem "Neuerstellen" bzw. bei Neustart der Applikation gibt es ja keine Probleme...

09.07.2010 - 12:20 Uhr

Folgende Frage wegen der Freigabe der Ressourcen:
an this.serialPort.Close(); hängt das Programm recht lang. Was kann man dagegen machen?

PS: bekomme durchgehend Daten (6byte alle 2-4ms)

23.05.2008 - 09:26 Uhr

Danke für die Antworten. Aktuell hat sich einiges verbessert indem ich
den StreamWriter


Encoding enc = Encoding.ASCII;
sWriter = new StreamWriter(path, false, enc, 2200);

fest konfiguriert habe und zusätzlich das Flushen selbst übernehme. Jetzt verliere ich nur noch wenige Daten.

Die Puffergröße habe ich mir wie folgt erreichnet:
63-68 Zeichen pro Zeile ~ 70
alle 30 Zeilen lasse ich ihn schreiben + 100 Puffer.

Bemerke per Performancecounter schon Veränderungen um eine ganze Stelle. Jedoch nur alle 4-20 Durchläufe. Hätte gedacht, dass dies durchs Threading kommt. Wie kann ich direkt abfragen, ob der GC aktiv ist?

Notfalls bleibt mir noch die Möglichkeit, direkt im CANRead Thread Strings zu basteln und diese in den Puffer für den Logger zu schieben.

Danke, Gruß

19.05.2008 - 14:19 Uhr

Hallo!
keine Antwort? Was für alternativen habe ich zum "Umschalten auf die anderen Threads"? Bin davon ausgegangen, dass ich mit Thread.Sleep(0) den aktuellen Thread die Ressourcen entziehe und ein anderer weiter arbeiten kann.?

mfg

15.05.2008 - 17:28 Uhr

okay, so siehts aus (etwas vereinfacht), falls was wichtiges zum Verständnis fehlt, einfach Bescheid sagen.


//Klasse CANHandler
public void startCANRead()
        {
            //config thread
            CANReadThreadIsAlive = true;
            CANReadThread = new Thread(CANReadData);
            CANReadThread.Priority = ThreadPriority.BelowNormal;
            
            //message counter
            count = 0;

            CANReadThread.Start();
        }
private void CANReadData()
        {
            messagesReceived = 0;
            messagesLost = -1;

            Int64 s1=0, s2=0;
            //Stopwatch stopWatch = new Stopwatch();

            while (CANReadThreadIsAlive)
            {
                CanPort.CanEvent ev;
                Object newMessage = new Object();              

                try
                {
                    /* Read events until error */
                    while (pCAN.ReadEventData(out ev) == 0)
                    {
                         //...
                         //Nachrichten auslesen & in Arraylist schaufeln
                         //...

                         //breaking reading
                         if (!CANReadThreadIsAlive) 
                         {
                             CANReadThreadIsAlive = false;
                             count = 0;
                             frmMain.Instance.ThreadStopped();
                             break;
                         }

                    }
                    Thread.Sleep(0);
                }
                catch
                {
                    //empty, jump into, if CE message queue is empty (normal just a few ms) 
                    Thread.Sleep(0);
                }

                /* Wait for next event */
                if (pCAN.WaitCommEvent(out mask) != 0)
                    throw new CanPortException("Error in WaitCommEvent()"); 
   
             }
        }
public void stopCANRead()
        {
            CANReadThreadIsAlive = false;
            count = 0;
            //loggingStep = 0;

            frmMain.Instance.ThreadStopped();
        }
                 

//Klasse Logger
public void startLogging(string folder)
        {
            //...
            //file anlegen usw.

            try
            {
               //...
               //feste daten in file schreiben, fehler vermeiden usw.

                if (isLogging)
                {
                    //config thread
                    MessageLoggerThreadIsAlive = true;
                    MessageLoggerThread = new Thread(saveMessagesThread);
                    MessageLoggerThread.Priority = ThreadPriority.BelowNormal;
                    MessageLoggerThread.Start();
                    
                    }
            }
            catch (Exception e)
            {
                    //Fehler abfangen usw.
             }
        }

public void saveMessagesThread()
        {
            while (MessageLoggerThreadIsAlive)
            {
                if (messageQueue.getNumber() == 0)
                    Thread.Sleep(0);
                else
                    saveMessage(messageQueue.get());
            }
        }


public void saveMessage(Object o)
        {
              //...
              //Daten aus Objekten lesen und in asc file schreiben per Streamwirter
              sWriter.Flush();
        }

//Klasse MessageQueue
public class MessageQueue
    {
        public static readonly MessageQueue Instance = new MessageQueue();

        private ArrayList list = new ArrayList(); 
        private static Object mutex = "";
        
        private MessageQueue () {}

        public Object get()
        {
            Object o;

            lock (mutex)
            {
                if (list.Count > 0)
                {
                    o = list[0];
                    list.RemoveAt(0);
                    return o;
                }
                return null;
            }
        }

        public void insert(Object o)
        {
            lock (mutex)
            {
                list.Add(o);
            }
        }

        public int getNumber()
        {
            return list.Count;
        }
    }

13.05.2008 - 13:34 Uhr

Hallo!
Danke für die Antworten!
Hab jetzt mal alles etwas umdesignt, dennoch ändert sich nix. Jenachdem wie ich die Thread Priorität verdrehe, entweder läuft mein Puffer voll, oder ich verliere nachrichten, oder im worstcase ist die gui nicht mehr ansprechbar. hab den code etwas optimiert, nicht wirklich merkbar.

noch eine Frage bzw. dem Warten, habe bisher immer ein Thread.Sleep(0), wenn z.B. der CAN Treiber keine Nachrichten im Puffer hat. Ist das so sinnvoll?

mfg

09.05.2008 - 11:20 Uhr

Folgende Frage zur sauberen Synchronisation:

wollte eigentlich die Monitor Klasse in Verbindung mit locks verwenden. Natürlich wird jedoch die Wait, Pulse und PulseAll Methode nicht vom CF 2.0 unterstützt. Welche Alternativen habe ich da?
Ist das AutoResetEvent performant genug?

Danke, mfg

08.05.2008 - 17:43 Uhr

Hallo!

Folgendes Verständnisproblem:

Grundlage:

  • Entwicklung auf einem WinCE-System (mit CF 2.0)
  • Busdaten werden empfangen, gesendet und ausgewertet und gespeichert

IST-Zustand:

  • die Mainklasse (Form) zeigt die Daten an, eine Busklasse liest in einem Thread die Daten vom Bus, ein Timer sendet Busdaten, im Lese-Thread werden die Daten auf einer SD-Karte geloggt
  • wenn eine Nachricht empfangen wird, wird diese ausgewertet, angezeigt(im Hauptthread) und ggf. geloggt (im selben Thread)

=> Problem: Aufgrund der hohen Emfangsdichte der Nachrichten werden zu viele Nachrichten nicht abgeholt und somit verloren

SOLL-Konzept:
Ein weiterer Thread für das Logging (Erzeuer/Verbraucher) soll die Daten speichern. Bringt das was? Oder welcher Ansatz wäre zu empfehlen? Kann ich das Logging optimieren?

Danke, mfg

06.02.2008 - 09:34 Uhr

wie verhält sich das eigentlich performancetechnisch zwsichen dem überschreiben der onpaint-methode und das zeichnen auf der bitmap für die picturebox?

01.02.2008 - 13:06 Uhr

das wollte ich eigentlich vermeiden.. 🙁 aber wenns die einzige möglichkeit is...

01.02.2008 - 11:28 Uhr

Nichts übersehen?

* SetStyle(ControlStyles.AllPaintingInWmPaint, true); (Sollte dann alles im OnPaint zeichnen und OnPaintBackground sollte gar nicht mehr aufgerufen werden)  
* DrawImageUnscaled (Bei dir habe ich DrawImage gesehen)  

Alternative:
BitBlt, weiss aber nicht ob das aufm PPC geht (Gibts ansonsten einiges zu im Forum).

SetStyle udn DrawImageUnscaled steht mir leider nicht zur Verfügung... liegt wohl am CF. (2.0)...
:?

22.01.2008 - 11:36 Uhr

Folgende Verständnisfrage:

habe mir eine Bitmap backBuffer und eine Graphics Objekt bufferGraphics angelegt, dies dann per

backBuffer = new Bitmap(266, 166);
bufferGraphics = Graphics.FromImage(backBuffer);

zugeweisen, und in onPaint zeichne ich alles in bufferGraphics
und am Ende wird das gezeichnete Bild in e.Graphics übernommen.

 e.Graphics.DrawImage(backBuffer, 0, 0);
base.OnPaint(e);

Jedoch besteht das Flackern weiterhin. Ist der Ansatz so richtig? Bzw. was für Alternativen habe ich noch?

edit
Auf einer Seite habe ich gelesen, dass man die OnPaintBackground Methode überschreiben soll, nicht die onPaint. Werds mal testen...
(http://www.codeprof.com/dev-archive/28/11-33-282887.shtm)

21.01.2008 - 16:54 Uhr

m... hab ich schon fast befürchtet... 🙁 wollt ich mir eigentlich sparen..
naja.. werd mal danach suchen.
danke schon mal..

edit:
für alle die es auch suchen:
http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx?df=100&forumid=262139&exp=0&select=1393574

21.01.2008 - 16:38 Uhr

Hallo,

habe mir ein eigenes Control zur Anzeige von Graphen geschrieben. Diese Flackert jedoch und ich finde kein Option, dieses als DoubleBuffered zu deklarieren.

Gibt es evtl. doch eine Möglichkeit, oder müsste ich die Grafik erst vorzeichen und das Steuerelement überschreiben? (habt Ihr evtl. einen Link hierfür?)

Danke, mfg

19.12.2007 - 11:37 Uhr

Hallo!
Folgendes Problem, verwende ein eigenes Steuerelement, welches von einem Panel abgeleitet ist, bzw. eine ähnliche Funktion hat. Jetzt benötige ich jedoch einen Button, welcher in sich in einem inaktiven (eigenen) Panel befindet, immer. Wie kann ich dies machen? Oder kann ich den Button über das Panel legen?

Info: CF 2.0
Danke, gruß
all_finder

10.12.2007 - 14:23 Uhr

Hallo!
Folgende Situation: ein Message Logger soll seine Daten in zyklischen Abständen abspeichern. z.B. alle 2 Sec.
Dabei wird die Arraylist entleert und in das Loggingfile geschrieben.

Wichtig ist, dass diese Operation minimal seitens der Zeit ist. Ist der StreamWriter für sowas zu gebrauchen? Kann die Datei durchgehend geöffnet bleiben, oder soll diese für diesen Vorgang immer erst geöffnet werden? Die Daten werden immer unten angehangen.

Danke, mfg

06.12.2007 - 17:33 Uhr

Hallo,

folgendes Szenario:

habe eine Klasse, welche einen Thread startet. Sobald dieser eine Aufgabe getan hat, soll er ein Event auslösen und sich beenden. Die GUI soll darauf reagieren und sich die neuen Daten von der Klasse holen, in der der Theard gestartet wurde.

Habe viele Beispiele gelesen, aber bin nicht wirklich auf eine Lösung gekommen. Die meisten Bsps behandeln das Problem nur in einer Klasse... Wie löse ich das Event aus - und wie reagiere ich auf dieses in der GUI?

Bitte um g Aufklärung...

05.12.2007 - 10:26 Uhr

danke für die Antwort.

Wie sieht es mit der Schachtelung aus? Nach meinem Haupteinstiegspunkt wird mein Hauptthread gestartet. Ist es vorteilhaft, hier eine weitere Schachtelung einzuführen und von dort aus Forms etc. zu starten, oder soll das lieber alles in der Hauptform bleiben?

sprich:
-Program.cs
--MyApp.cs
---GUI.cs
---Data.cs
---Operationhandler.cs
...

oder lieber:
-Program.cs
--GUI.cs
---Data.cs
---Operationhandler.cs
...

05.12.2007 - 10:06 Uhr

Hallo!

Programmiere seit einiger Zeit Tools in C#, meist Programme von mittlerem Umfang. Jedoch stellen sich folgende Fragen, für die ich noch keine Antwort gefunden habe. (gebe mich auch mit Links statt Text zufrieden 😉)

Bisher startet meine Anwendung im Haupteinstiegspunkt (Application-Klasse), welche von VS vorgeschlagen wird. Mehr passiert in dieser Klasse nicht. Was könnte ich dort noch unterbringen? (maximal Auswertung von Startparameter)

Alle Objekte werden aus der GUI erstellt, oder per Singleton. Wo starte ich sinnvollerweise Threads?
Gibt es ein Beispiel für die Organisation von größeren Programmen?

Danke, MfG

24.10.2007 - 10:52 Uhr

keine Antwort?

16.10.2007 - 13:19 Uhr

Hallo!
Versuche verzweifelt die Form auszublenden. Direkt in der Form geht es per .Visible bzw. Hide nicht.
Was für Möglichkeiten bleiben mir?
Danke, mfg

22.08.2007 - 09:49 Uhr

@fabian; ich würd nicht fragen - wenn ichs gefunden hätt'

22.08.2007 - 09:33 Uhr

Hallo!
Danke für die Antwort. Ist diese Funktion im CF2.0 überhaupt vorhanden? (hätt ich dazu schreiben sollen 😉)

21.08.2007 - 12:13 Uhr

Hallo!
Habe mir ein eigenes grafisches Steuerelement gebastelt, dieses hat eine Grafik hinterlegt, welche sich nicht seitens der Größe ändern soll. Wie kann ich dem Steuerelement eine permanente Größe zuweisen?
Die eigentliche Größe habe ich festgelegt, jedoch kann der Benutzer dennoch im Entwurfsmodus die Größe ändern.

Danke, mfg

06.08.2007 - 15:27 Uhr

schon etwas her.. aber wieder wichtig 😉

die methode:

        [DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
        public static extern bool DeviceIoControlProperties(
            IntPtr hDevice,
            uint dwIoControlCode,
            uint lpInBuffer,
            int nInBufferSize,
            out CANElements.canbus_properties lpOutBuffer,
            int nOutBufferSize,
            out uint lpBytesReturned,
            IntPtr lpOverlapped);

habs auf int geändert.. jedoch weiterhin erfolglos

25.06.2007 - 13:14 Uhr

habe mich etwas mit dem savearray gespielt...

bekomme in diesem fall eine exception (NotSupportedException) von *.Marshal.SizeOfInternal()
habe mehere kombinationen versucht, aber ohne erfolg. erstes problem ist das ulong array.. ich ab das jetzt aktuell als SaveArraySubType= VarEnum.VT_UINT verwendet.. direkt für ulong habe ich nichts gefunden...

25.06.2007 - 11:38 Uhr

danke für die antwort, verstehe jedoch die anwendung noch nicht ganz...

habe jetzt die sizeconst entfernt.

evtl. noch von interesse - hab ich vorhin vergessen - ich entwickle mit dem cf 2.0

25.06.2007 - 10:43 Uhr

Hallo!

Habe folgendes Problem:
eine externe Methode (unverwalteter Code) gibt mir ein Struct in folgenden Elementen zurück: (und natürlich geht das nicht ganz so - wie geplant)

unsigned long (version)
TCHAR name[]
long min
long max
int nCommands
int commands[]
int nRates
unsigned long rates[]
unsigned long flags
int number_register

bisher hab das wie folgt in der klasse angewandt:


public ulong version;
[MarshalAs(UnmanagedType.LPWStr)]
public string name;        
public long min;                                                           
public long max;                                                           
public uint commands;                                       
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] //testweise 20
public uint[] commands; 
public int nRates;                               
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public ulong[] rates; 
public ulong flags;                                                
public uint number_registers;

aufgerufen wird die externe methode per:
DeviceIoControlProperties(hPort, /../ out MyClass, Marshal.SizeOf(MyClass) /../);

aktuell erhalte ich von GetLastWin32Error 0x57.

Tipps?

04.06.2007 - 13:30 Uhr

Hallo!
Möchte keine neues Thema erstellen:

wie sieht es mit komprimierten PNG - Files aus? habe das Problem, dass diese nur unkomprimiert richtig angezeigt werden.

oder liegt das evtl. am Compact Framework?

Danke,
gruß