Brauche Tipps für eine Aufgabe



  • Ciao CPP-Gemeinde,

    bin von der prozessorientierten Szene, d.h. VB. Neulich habe ich eine Aufgabe zu bewältigen:

    eine Klasse ist so aufzubauen, dass jede ihrer Instanzen (ca. 30) automatisch auf Messwerte anderer Software reagieren kann.

    Weil ich überhaupt keine Erfahrung mit OOP gehabt habe, würde froh, wenn Ihr mir mehr oder weniger Tipps geben könntet.

    Danke.



  • Wie sieht denn dein bisheriger Versuch aus? Poste den doch mal, dann sehen wir weiter.



  • nicht etwas dürftig die Angaben zum problem? Ist das ca. 30 mal die gleiche Software mit der gleichen uns nicht bekannten Schnittstelle? Wie werden die Daten von der Software zu deiner Übertragen? So viele Fragen die unbeantwortet sind, kann man nur als Antwort schreiben. Erstelle eine Klasse die auf Daten aus einer Software wartet, diese Klasse verfrachtest du in einen Thread und startest diesen ca. 30 mal. die Daten könnte man dann in einer DB oder einen File oder sonst wo sammeln, aber auch gleich weg schmeißen. Bei der ganzen Sache ist dann nur noch zu beachten, dass wenn du in ein File oder etwas in einem Window ausgeben möchtest, das du nur noch die Threads mit dem entsprechenden Mainthread syncronisieren musst, sonst fliegt dir das alles um die Ohren. So jetzt sollte doch dein Problem weitreichen gelösst sein oder nicht?



  • _matze schrieb:

    Wie sieht denn dein bisheriger Versuch aus? Poste den doch mal, dann sehen wir weiter.

    Hallo _matze,

    Danke für die Antwort. Alles ist noch in der Überlegungsphase (schöner gesagt: Modellierung). Nichts kann ich jetzt vorlegen.

    CTecS schrieb:

    ... Ist das ca. 30 mal die gleiche Software mit der gleichen uns nicht bekannten Schnittstelle? Wie werden die Daten von der Software zu deiner Übertragen? ...

    Hallo CTecS,

    Danke für die Antwort.

    Ja, die 30mal Instanzen sollen von einer gleichen Klasse sein. Sie unterscheiden sich von Parametern.

    Die Schnittstellen sind kein Problem. Man kann es mit internern Speichern lösen.

    CTecS schrieb:

    ... Bei der ganzen Sache ist dann nur noch zu beachten, dass wenn du in ein File oder etwas in einem Window ausgeben möchtest, das du nur noch die Threads mit dem entsprechenden Mainthread syncronisieren musst, sonst fliegt dir das alles um die Ohren. ...

    Mir ist die Synchronisation ein Rätsel. Wenn das Messprogramm einen Wert lieft, soll meine Klasse schnell drauf reagieren können, z.B. berechnen, Ergebnis ausgeben. Bei VB würde man gemäss verschiedener Parameter sukzessiv nachfragen. Aber nach einer Runde von 30 Varianten können viele Messwerte zwischendurch schon verpasst werden.

    Jetzt hätte ich gerne die Vorteile von OOP erlebt: jedes Objekt reagiert selbständig.

    Wäre es möglich?



  • Jeder Thread läuft für sich und wartet auf Daten, entweder du pollst auf den Speicher den die Programme zur Datenübertragung nuten oder du benutzt eine Sytemweite Usermessage was auch geht oder du überträgst die Daten zwischen den Programmen übers Netzwerk.

    Wobei die Frage besteht, warum da überhaupt noch ein Porgramm zwischendrin ist, warum empfängst di die Daten nicht direct inm deinem Programm, dann ersparst du dir die Datenübertragung noch mal.

    Wie du dann die Daten in deinem Programm aus den Threads überträgst, da gibt es mehrere Möglichkeiten (wie immer), entweder du benutzt wieder eine Usermessagen womit du die Daten in dein Hauptwindow überträgst, oder du benutzt einen stapel und syncronisierst darüber. Klassen zum Synconisieren sind da CSyncObject wo du dich auch sicher weiter belesen kannst. ich will das aber hier auch nicht weiter ausweiten, weil das jetzt alles zu erklären sicher den Rahmen sprengen würde.



  • Es existiert ein Messprogramm aus VB. Wenn ich es weiter aufblasen würde, wäre mir nicht nur zeitlich ungünstig: Um 30 Varianten eins nach dem anderen zu evaluieren, kommt mir wie Steinzeit vor. Dann möchte ich es mit OOP ausprobieren.

    Es kommt zuerst die kostenlose VS Express Version in Frage. Eine Professional Version möchte ich nicht ausschliessen, aber nur wenn unbedingt.

    Meine Vorstellung:

    1. Eine DLL in C++ erstellen und mit VB verlinken;
    2. Eine Klasse in dieser DLL erstellen;
    3. Instanzen (30x) dieser Klasse nur am Anfang erzeugen und bis Programmende erhalten;
    4. Jede Instanz soll auf mich zuhören: jetzt lautet der Messwert so und so. Dann verhält sich jede selbständig und gibt mir ihre Rechenergebnisse so bald als möglich zurück (irgendwo ablegen).

    Mehr will ich nicht. Ist es schwierig?



  • Wenn dafür eine DLL überfordert wird, bleibt mir nichts übrig, als eine Win32-Anwendung zu erstellen. Aber wie?



  • cppnewbe schrieb:

    Ist es schwierig?

    .. nein, ich glaube, dass ist nicht schwierig. Aber ich verstehe Deine Anforderungen nicht.

    Wie kommen die Messwerte in Dein Programm? Du sagst es ist eine(!) Schnittstelle. Ist es eine Serielle Schnittstelle? Wartet genau ein Thread blockierend auf alle Ergebenisse? Gibt es einen Interrupt?

    Woher weiß man, dass ein Messwert z.B. für das 27. Objekt ist?

    Gruß
    Werner



  • @cppnewbe:
    Du solltest vielleicht mal mehr infos geben woher die daten sind wie die in dein Programm rein kommen usw. so fuschen alle im dunklen und keiner kann dir wirklich helfen, kommen die Daten zum Beispiel von einer A/D Karte oder der Serielen Schnittstelle, dann macht es wenig sinn wenn du 30 Threads auf machst, es kann ja immer nur ein ergebnis zur gleichen zeit kommen, also gib mehr details und es wird sich sicher eine lösung finden.

    und ja die Dll schafft locker 30 Threads, ist nur die frage wie du die Threads schreibst und wieviel zeit jeder Thread alleine verballert um paar daten zu handeln.



  • Hallo Werner und CTecS:

    Danke für die Antwort. Ok, ich versuche die Aufgabe einfach zu beschreiben:

    - Ein Programm (in VB geschrieben) liefert Messwerte sekundenweise. Die Daten kann ich auf Shared Memory ablegen und durch neue Anwendung ebenda ablesen, d.h. Schnittstelle no problem.

    - Zu jedem Messwert soll man 30 andere Nebenwerte ermitteln. Dies möchte ich in einer neuen EXE-Andwendung mit OOP erledigen, wenn es mit DLL nicht geht.

    In den letzten Tagen habe ich mir ein grobes Konzept ausgedacht:

    1. Die Eigenschaften der Nebenwerte fasse ich in einer Class zusammen und erzeuge 30 Instanzen davon. Diese unterscheiden sich von Parametern.

    2. Für jede Instanz erzeuge ich einen Worker-Thread. Jeder Worker-Thread soll bis Programmende bleiben und immer auf Event (TextChanged) reagieren.

    3. Die Threads synchronisieren sich natürlich, um Ergebnisse ausgeben zu können.

    Gäbe es andere einfachere Lösung?



  • warum denkst du das du zu jeden Nebenwert den du erzeugen willst, einen eigenen Thread brauchst, ist die Berechnung so aufwändig? Denn bezogen auf den Prozessor den du benutzt nützen dir 30 Threads auch nichts wenn du nur eine Single-Cpu verwendest, dann kannst du das alles auch in einem Thread erledigen.

    Das mit der Dll geht wie gesagt nur musst die ja von einer exe geladfen werden, wolltest du das aus VB machen? an sonsten kannst du auch gleich eine exe erstellen und die ganze Dll-Problematik außer acht lassen.



  • cppnewbe schrieb:

    - Ein Programm (in VB geschrieben) liefert Messwerte sekundenweise. Die Daten kann ich auf Shared Memory ablegen und durch neue Anwendung ebenda ablesen, d.h. Schnittstelle no problem.

    .. als 'no problem' würde ich das nicht bezeichnen. Woher weiß der lesende Prozess, dass ein neuer Wert da liegt und woher weiß der schreibende Prozess, dass der Wert gelesen wurde und aktualisiert weden kann. Dazu benötigst Du eine Synchronisierung des ganzen und ein globales Mutex um die einzelnen Zugriffe atomar zu gestalten. Sonst läufst Du Gefahr in 'racing conditions' rein zulaufen.

    cppnewbe schrieb:

    - Zu jedem Messwert soll man 30 andere Nebenwerte ermitteln. Dies möchte ich in einer neuen EXE-Andwendung mit OOP erledigen, wenn es mit DLL nicht geht.

    OOP und DLL sind gänzlich unabhängig von einander. Du kannst beides machen oder nicht machen, das eine hat mit dem anderen nichts zu tun.

    cppnewbe schrieb:

    Die Eigenschaften der Nebenwerte fasse ich in einer Class zusammen und erzeuge 30 Instanzen davon. Diese unterscheiden sich von Parametern.

    Du solltest vielleicht mal 2 oder 3 Beispiele nennen, was Da in den 30 Instanzen passiert. Ich habe immer noch Schwierigkeiten mir Deine Anforderungen vorzustellen.

    cppnewbe schrieb:

    2. Für jede Instanz erzeuge ich einen Worker-Thread. Jeder Worker-Thread soll bis Programmende bleiben und immer auf Event (TextChanged) reagieren.

    Für einen oder gar 30 Threads sehe ich nach wie vor keinen Grund.

    Eine Lösung, die mir vorschwebt, ist das was man auch unter 'Chain of Responsibilty' bezeichnet. In Deinem Fall könnte man es vielleicht so realisieren, dass die Funktion, die den Messwert entgegen nimmt, einfach alle 30 Nebenwert-ermittelnde-Objekte nacheinander aufruft und jedes Objekt weiß dann für sich was mit dem Messwert zu tun ist.

    Gruß
    Werner


Log in to reply