Ideensuche Synchronisation



  • Ich bastel' hier an einer Anwendung mit einem Sender und (potentiell) mehreren Empfängern, die die Daten weiterleiten sollen:

    Sender:
    Der Sender bekommt in unregelmäßigen Abständen einen neuen Datenblock und schreibt ihn in einen internen Speicherbereich (BYTE* m_data) - an den alle Empfänger rankommen.
    (dazu wird im Hauptthread die Methode SetData() aufgerufen)

    void SetSize(int bufsize)
    {
      m_data=new BYTE[bufsize];
      m_dlen=bufsize;
      //aus den Angaben wird später auch die Größe des Ausgabepuffers ermittelt
    }
    
    HRESULT SetData(BYTE* data)
    {
      memcpy(m_data,data,m_dlen);
    }
    

    Empfänger:
    Die Empfänger arbeiten permanent in einer Schleife und kopieren den Inhalt von m_data in einen eigenen Puffer, der dann weitergegeben wird.
    Die Schleife kann ich nicht beeinflussen, lediglich die Methode zur Datenbereitstellung:

    HRESULT FillBuffer(BYTE* pBuffer)
    {
      memcpy(buffer,send.m_data,send.m_dlen);
    }
    

    (OK, in der kompletten Anwendung gehört auch noch etwas Fehlerüberprüfung dazu)

    Da diese Schleife recht schnell abgearbeitet wird, muß ich meine Empfänger pausieren lassen, wenn der Sender eine Weile auf neue Datenpakete wartet. In einer 1-zu-1 Situation hatte ich dazu einen automatischen Event verwendet, mit dem der Empfänger benachrichtigt wurde, aber der ist hier nicht wirklich einsetzbar (der schnellste Empfänger würde den Event wieder ausschalten und die übrigen bemerken nichts davon).
    Also: Hat jemand eine bessere Idee, wie ich diese Datenverteilung koordinieren kann?

    (PS: Sagt mir nur Bescheid, wenn es nicht ganz hierher passt)



  • siehe Dir mal das Bsp. von MS an.

    http://windowssdk.msdn.microsoft.com/library/en-us/dllproc/base/using_event_objects.asp

    Das müßte doch auf dein Problem passen.

    Gruß



  • Hmm, da ist doch ein Ansatz *versucht, das Beispiel auf sein Problem umzumünzen*





  • @Hmm: Arg viel zu lesen - gibt es dazu zufällig ein Inhaltsverzeichnis, mit dem ich mir die "richtigen" Abschnitte raussuchen kann?

    @all: Ich weiß nicht, ob's noch eleganter geht, aber das dürfte für mich funktionieren:

    Quelle:

    vector<HANDLE> rd_evts;//gefüllt mit den rd-Events der Empfänger
    Target* targets;//das Feld gab's schon, also habe ich es mitgenutzt
    CEvent write;//Schreib-Event
    
    SetData(BYTE* data)
    {
      write.ResetEvent();
      WaitForMultipleObjects(m_tgCount,&rd_evts[0],TRUE,INFINITE);
    
      memcpy(m_data,data,m_dlen);
    
      for(i=0;i<m_tgCount;++i)
        targets[i].m_rcv.SetEvent(); //alle Ziel benachrichtigen
      write.SetEvent();
      return S_OK;
    }
    

    Empfänger:

    CEvent m_rd; //ready - wird in rd_evts der Quelle eingetragen
    CEvent m_rcv;//Recieve
    
    FillBuffer(BYTE* buffer)
    {
      HANDLE evts[]={m_rcv,source->write};
      WaitForMultipleObjects(2,evts,TRUE,INFINTE);
    
      memcpy(buffer,source->m_data,source->m_dlen);
    
      m_rd.SetEvent();//Rückmeldung an Quelle
      return S_OK;
    }
    

    Nun stehe ich vor dem nächsten Problem - wie kann ich von außen die ganze Angelegenheit anhalten? (*geht weiter basteln*)


Anmelden zum Antworten