none
Wie Timer-Methode mit variablen Parametertyp erstellen? RRS feed

  • Frage

  • Hi Leute,

    habe heut wiedermal ein knackiges Problem. Ich benutze in meinem Programm einen Timer, bei dessen Tick-Ereignis grob umschrieben eine große Daten-Struktur paketweise vom PC an eine externe Hardware geschickt wird. Bisher habe ich das mit einem festen Strukturtyp getan, nun soll es aber an verschiedene/variable Strukturtypen angepasst werden. Sprich statt Daten meiner derzeitigen "strDatenHardware1 hardware1" sollen auch andere Strukturtypen wie "strDatenHardware2 hardware2" usw. funktionieren, aber alles mit der selben Timer-Methode. 

    Die Lösung eines solchen Problems müsste über Templates realisierbar sein. Nur weiß ich nicht wie ich die standard Timer-Methode in ein Template umwandle... geht das überhaupt, oder bin ich auf dem Holzweg? Hier etwas Beispielcode zum besseren Verständnis:

     

    //Form1.h
    public: struct strParameter * meineParameter; //fixe Datenstruktur
    ...
    private: System::Void timerDatenSenden_Tick(System::Object^ sender, System::EventArgs^ e)
    	{
    	long erg = 0;
        switch(meineParamter->IdBaudrateIst) //Bitrate einstellen
    			{
    			case(0): erg = SetBaudrate(hHandle,BAUD_100KBIT);
    		           break;
    			case(1): ...
    			...
    	//usw.
    

    Die Struktur "meineParameter" soll nun durch einen Platzhalter ersetzt werden, sodass auch andere Strukturen einsetzbar sind. Knackpunkt dabei ist natürlich, dass die Struktur-Eigenschaften die ich in der Timer-Methode abfrage, bei jedem Strukturtyp vorhanden sind! Ich möchte halt verschiedene Strukturen erstellen, die einen gewissen Datenstamm immer gleich haben, und einen weiteren spezifischen Datenteil besitzen.

     

     


    Montag, 11. Juli 2011 14:12

Antworten

  • Warum verwendest Du ein "struct"???

    Du mischt hier unmanaged und managed Code... das macht keinen Sinn...

    Nimm eine "ref class" und leite die verschiedenen Typen von einer gemeinsamen Basisklasse ab.

    Und wie gesagt: Nimm C#! Es lohnt sich immer noch umzusteigen!!!


    Jochen Kalmbach (MVP VC++)
    Montag, 11. Juli 2011 15:25

Alle Antworten

  • Warum verwendest Du ein "struct"???

    Du mischt hier unmanaged und managed Code... das macht keinen Sinn...

    Nimm eine "ref class" und leite die verschiedenen Typen von einer gemeinsamen Basisklasse ab.

    Und wie gesagt: Nimm C#! Es lohnt sich immer noch umzusteigen!!!


    Jochen Kalmbach (MVP VC++)
    Montag, 11. Juli 2011 15:25
  • Eine ref class wollte ich ursprünglich auch nehmen, aber da ich meine Daten byteweise übertrage, und das auch noch per Zeigerzugriff und (unsigned char)-casts in einer Schleife... da viel mir nur die Struktur ein mit der sowas gut geht. Gerade durch den Zeigerzugriff ist es sehr wichtig, dass die Daten wirklich hintereinander ohne Lücken im Speicher stehen. Dazu musste ich meine Struktur in "#pragma pack(push, 1)" einhüllen. Bei Klassen kann ich mir nie sicher sein, ob die einzelnen Felder wirklich hintereinander im Speicher stehen, und ich glaub auch nicht dass es mit dem Zeigerzugriff funktionieren würde, oder?

    Managed und unmanaged Code mixe ich wirklich... als ich mit dem Programm und gleichzeitig mit .NET begann, viel mir der Umstieg dadurch leichter.

    Könnte ich nicht irgendwie den ersten Parameter der Timer-Class dazu verwenden? Vom Typ her ist er System::Object... das heißt doch das er alles sein kann. Wie kann ich ein Timer-Ereignis Starten mit Angabe dieses Parameters? Sachen wie "timer1->Start(strParameter);" funktionieren leider nicht.
    Dienstag, 12. Juli 2011 06:25
  • Habe gerade herausgefunden, das die Datentypen der Templates bereits zur Compilierzeit bestimmt werden. Somit fallen sie für mich raus, da sich meine Typen erst zur Laufzeit ergeben.
    Dienstag, 12. Juli 2011 07:55
  • Warum kapselst Du die Daten nicht in einer eigenen Klasse, die eine entsprechende Implementierung eines Adapters hat? Also einfach ein Interface, dass durch die Hardware bestimmt ist und für alle Hardware gleich ist?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 13. Juli 2011 07:28
    Moderator
  • Ok, dann werde ich es doch mal über die "Jede Hardware bekommt ihre eigene Klasse"-Variante probieren. Ich danke euch zweien!
    Montag, 18. Juli 2011 07:18