Online-Skater
Erfahrenes Mitglied
Hallo Tutorianer,
diesmal habe ich ein Problem mit asynchronen Methoden im Zusammenspiel mit Threads der boost library. Folgende Klasse ist gegeben:
Möchte man nun asynchron Daten setzen, so ruft man handleSetDataAsync auf.
Diese erstellt eine Struktur, welche die eigene Instanz (abgeleitet von NetworkPlugin) und die Paramter speichert. Diese wird mit der Methode helpSetDataAsync einem Thread übergeben, damit die Daten unabhängig vom aktuellen Thread gesetzt werden. Nun sollte die statische Methode helpSetDataAsync parallel gestartet werden.
Diese führt die synchrone Methode handleSetDataSync für das setzen von Daten aus und der Callbackhandler benachrichtigt das Plugin das die Daten gesetzt sind.
Die spannenden Fragen sind:
Es wird bei jedem Aufruf neuer Speicherplatz angefordert für den thread, und es wird nicht freigeräumt wenn der thread fertig ist. Wie kann man das lösen ? An welcher Stelle sollte ein join() ? Denn erst danach kann ich den Speicher freigeben !?
Kann man bei den boost_thread irgendwie ein Status abfragen ob der thread gestartet ist ähnlich wie bei pthread:
Wenn noch weitere Fragen sind oder ihr einen anderen Ansatz oder Vorschlag habt, asst mich nicht dumm sterben
Habe nur wenig Erfahrung mit boost::thread.
Mfg
diesmal habe ich ein Problem mit asynchronen Methoden im Zusammenspiel mit Threads der boost library. Folgende Klasse ist gegeben:
C++:
class NetworkPlugin: public GenericPlugin
{
public:
NetworkPlugin(DispatchUnit * dispatchUnit);
virtual ~NetworkPlugin() {};
virtual IODatap handleGetDataSync(const IODataType &type) = 0;
virtual void handleSetData(const IODataType & type, IODatap data) = 0;
void handleSetDataAsync(const IODataType & type, IODatap data, SetDataAsyncCallbackFunction callbackHandler);
void handleSetDataSync(const IODataType & type, IODatap data);
private:
static void helpSetDataAsync(SetDataAsyncHelperNetwork* sdah);
boost::thread* tAsync; ///< Thread for handle data asynchronous
};
C++:
void NetworkPlugin::handleSetDataAsync(const IODataType & type, IODatap data, SetDataAsyncCallbackFunction callbackHandler)
{
SetDataAsyncHelperNetwork* sdah = new SetDataAsyncHelperNetwork(this, type, data, callbackHandler);
tAsync = new boost::thread(boost::bind(helpSetDataAsync, sdah));
}
C++:
void NetworkPlugin::helpSetDataAsync(SetDataAsyncHelperNetwork* sdah)
{
try
{
sdah->instance->handleSetDataSync(sdah->type, sdah->data);
if (sdah->callbackHandler)
sdah->callbackHandler(sdah->type);
delete sdah;
}
catch (AgentException agentException)
{
std::cerr<<"Exception in NetworkPlugin context ("<<agentException.reasonCode()<<"):"<< agentException.reasonText()<<"\n";
exit(-agentException.reasonCode());
}
}
Die spannenden Fragen sind:
Es wird bei jedem Aufruf neuer Speicherplatz angefordert für den thread, und es wird nicht freigeräumt wenn der thread fertig ist. Wie kann man das lösen ? An welcher Stelle sollte ein join() ? Denn erst danach kann ich den Speicher freigeben !?
Kann man bei den boost_thread irgendwie ein Status abfragen ob der thread gestartet ist ähnlich wie bei pthread:
Code:
void NetworkPlugin::handleSetDataAsync(const IODataType & type, IODatap data, SetDataAsyncCallbackFunction callbackHandler)
{
int ret;
SetDataAsyncHelperNetwork* sdah = new SetDataAsyncHelperNetwork(this, type, data, callbackHandler);
pthread_attr_t * attr = 0;
void * arg = sdah;
ret = pthread_create(&pthread, attr, NetworkPlugin::helpSetDataAsync, arg);
if (ret != 0)
{
throw AgentException(AgentException::PluginRunError,
"Cannot execute plugin thread to do setDataAsync");
}
}
Wenn noch weitere Fragen sind oder ihr einen anderen Ansatz oder Vorschlag habt, asst mich nicht dumm sterben

Mfg