Konzept für Parallelisierung gesucht (war : ich brauche einen Tipp)
-
ich habe angefangen mit der programmierung in c++ (mit dem turobexplorer 2006). ich möchte folgendes umsetzen: mein programm stellt daten bereit (zur in einen memo-feld). diese daten werden zeilenweise ausgelesen von bis zu 4 threads, die die daten weiterverarbeiten und damit berechnungen ausführen. jeder thread, der sich ein datenpaket abgeholt hat, löscht es aus dem memo-feld (es wird immer die 1. zeile eingelesen).
meine 1. frage ist: wie kann ich die daten noch bereitstellen, außer in einem memo-feld? die verarbeitung der daten erfolgt während weiter daten bereitgestellt werden.
die 2. frage ist: das das auslesen und das löschen der daten/zeilen des memos synchronisiert werden muss, ist mir klar, aber muss ich eventuell für das bereitstellen auch einen thread anlegen und das schreiben auch synchronieren?
ps: ich hoffe ich habe mich verständlich ausgedrückt.
-
Hallo
1. Du kannst zum Beispiel auch TStringGrid oder TListView benutzen.
2. Kommt drauf an wie das Bereitstellen der Daten laufen soll. Trägt der Benutzer diese direkt ein? Wenn ja dann bauchst du keinen weiteren Thread, die GUI läuft ja sowieso in ihrem eigenen. Wenn die Daten automatisch im Hintergrund aus einer anderen Quelle gelesen werden, dann brauchst du einen extra Thread dafür. Und diesen must du auch mit der GUI synchronisieren.
3. Bitte aussagekräftige Threadtitel verwenden!
bis bald
akari
-
Die STL bietet die entsprechenden Containerklassen wie z.B. std::vector oder std::list. Du musst lediglich den Zugriff darauf synchronisieren, zum Beispiel mit einer Critical Section.
#include <vector> #include <SyncObjs.hpp> class DataQueue { TCriticalSection* CS; vector<AnsiString> Data; public: DataQueue() : CS( new TCriticalSection() ) { } ~DataQeueue() { delete CS; } bool pop( AnsiString& strValue ) { CS->Enter(); bool Success = false; if( false == Data.empty() ) { strValue = Data.front(); Data.erase( Data.begin() ); Success = true; } CS->Leave(); return Success; } void push( const AnsiString& strValue ) { CS->Enter(); Data.push_back( strValue ); CS->Leave(); } };
Du musst nur noch sicherstellen, dass für jeden CS->Enter() der entsprechende CD->Leave() Aufruf stattfindet, selbst wenn der Thread beim Zugriff auf die Funktionen beendet wird oder in der push/pop Methode eine Exception auftritt.