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*
-
vielleicht findest Du auch hier etwas:
http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel17.htm
-
@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*)