2016-07-08 15 views
-2

Ich habe eine Klasse, die ich verwende, um die Erstellung und die Zerstörung von Threads zu verwalten, die für das Senden und Empfangen von CAN-Nachrichten zuständig sind. Ich weiß nicht, ob das der beste Weg ist, um das zu tun, also suche ich nach Ratschlägen, wie ich meine Threads für das Versenden von Nachrichten und das Empfangen von Nachrichten verwalten kann.Verwenden der Thread-Klasse zum Verwalten von Senden/Empfangen von Nachrichten

Grundsätzlich möchte ich spawnThread() einen Thread für das Objekt generieren, das an es übergeben wird. so, etwas zum Effekt von

spawnThread(T obj) 
{ 
    std::thread (&T::obj, this); 
} 

Meine Erwartung war, dass ich die Thread-Klasse verwenden würde für zwei getrennte Klassen und Sendmessage ReceiveMessage Starten und Beenden des Thread zu verwalten. Gibt es eine bessere Möglichkeit, Threading für das Senden und Empfangen von Nachrichten zu behandeln?

+0

Sie können ein Mitglied der '' cManageThread''-Klasse hinzufügen und dieses im Konstruktor übergeben . Sie könnten dies für die Vererbung entwerfen und diesen Konstruktor als 'geschützt' definieren. –

+0

Können Sie ein Beispiel geben, wie das erreicht werden würde? Ich habe mir den Weg der Vorlagen gelehnt, aber ich bin immer noch ziemlich neu in C++, also habe ich Schwierigkeiten damit, Syntax richtig zu machen. – Rethipher

+0

Es ist immer noch nicht klar, was Sie eigentlich erreichen wollen. Willst du eine Klassenhierarchie haben? Möchten Sie nur eine Vorlagenschnittstelle? Was sollte 'spawnTrread()' tun? Einen neuen Thread starten Dann suchen Sie wahrscheinlich nach einer Implementierung des Thread-Pools. –

Antwort

2

Es gibt keine Manager-Muster in OO. Ein Thread führt entweder einen kontinuierlichen Job aus, wie das Warten auf Verbindungen, oder er führt einen einzelnen Job aus. Der letzte Typ sind in der Regel Worker-Threads, die wiederverwendet werden.

Jetzt kommt zu der Frage. Threading skaliert nicht. Wenn Sie Sende-/Empfangsaufgaben haben, verarbeiten Sie sie in einem Worker-Thread-Pool mit fester Größe. Als Konsequenz reagiert Ihre Anwendung langsamer, wenn die Arbeitslast Ihre Poolgröße erweitert, da neue Anforderungen auf einen Worker warten müssen, aber sie funktionieren weiterhin.

+0

Diesem Sentiment folgend, erstellen Sie eine Warteschlange, die die Nachrichten enthält, die gesendet werden müssen, und, falls erforderlich, eine zweite Warteschlange, in der gesendete oder zurückgesendete Nachrichten gesendet werden können. Erstellen Sie einen Pool von "einigen * n" * -Threads, die für das Senden von Nachrichten im Namen von Personen verantwortlich sind, die eine gesendete Nachricht benötigen. Jeder Thread wartet darauf, dass eine Nachrichtenanforderung in der Warteschlange ankommt, und sendet sie dann.Sehr wahrscheinlich werden Sie feststellen, dass Sie nur einen * Thread zu diesem Zweck benötigen. (Es ist üblich, einen zweiten Thread zu haben ... normalerweise nur einen ... um "Empfangen" zu behandeln.) –