Hallo zusammen,
folgendes Problem bewegt mich grade: Von einem Bussystem (CAN-Bus) bekomme ich Datenpakete über eine (serielle) Schnittstelle in den PC - diese möchte ich weiterverarbeiten. Im Bussystem sind mehrere Teilnehmer, die auch in meiner Software virtuell abgebildet sind. Kommen vom Bus Daten, werden die von den virtuellen Teilnehmern verarbeitet.
Momentan läuft es so ab: Ein Datenpaket kommt herein, es wird herausgesucht zu welchem der Teilnehmer es gehört und wird diesem zugestellt. Dieser kann dann die Daten analysieren und weiterverarbeiten, was je nach Dateninhalt auch etwas länger dauern kann. Da vom Bus schon mal 1000 Pakete in der Sekunde kommen können, kann es passieren dass es dauert bis die neuen Pakete weitergeleitet werden, da die ganze Geschichte einigermaßen zeitkritisch ist, kommt das dann hin- und wieder zu Problemen.
Um das Ganze zu optimieren habe ich mir überlegt, die Pakete an die virtuellen Teilnehmer jeweils in einem Thread weiterzuschicken, wenn dann bei einem die Verarbeitung etwas länger dauert (z.B. weil in der Zwischenzeit ein Dateizugriff geschieht, der etwas dauert), können die anderen Pakete parallel weiterverarbeitet werden.
Das ist zwar an sich schön, aber macht es nicht einfacher, denn die Threads müssen ja vielleicht auch synchronisiert werden, aber das wäre schon machbar. Was mich aber noch mehr stört, ist dass wegen jeder Nachricht ein Thread ausgeführt wird - wie ist das von der Performance her? Klar kann ich einen Thread Pool verwenden, aber jeder Thread muss doch initialisiert werden, könnte das den Performancegewinn wieder beeinträchtigen? Im dümmsten Fall könnten ja pro Sekunde 1000 Threads gestartet / beendet werden, ist das zu heftig? Wäre es dann doch effizienter, die Nachrichten in einem Thread nacheinander abarbeiten zu lassen und dann lieber die Abarbeitung irgendwie zu optimieren?
folgendes Problem bewegt mich grade: Von einem Bussystem (CAN-Bus) bekomme ich Datenpakete über eine (serielle) Schnittstelle in den PC - diese möchte ich weiterverarbeiten. Im Bussystem sind mehrere Teilnehmer, die auch in meiner Software virtuell abgebildet sind. Kommen vom Bus Daten, werden die von den virtuellen Teilnehmern verarbeitet.
Momentan läuft es so ab: Ein Datenpaket kommt herein, es wird herausgesucht zu welchem der Teilnehmer es gehört und wird diesem zugestellt. Dieser kann dann die Daten analysieren und weiterverarbeiten, was je nach Dateninhalt auch etwas länger dauern kann. Da vom Bus schon mal 1000 Pakete in der Sekunde kommen können, kann es passieren dass es dauert bis die neuen Pakete weitergeleitet werden, da die ganze Geschichte einigermaßen zeitkritisch ist, kommt das dann hin- und wieder zu Problemen.
Um das Ganze zu optimieren habe ich mir überlegt, die Pakete an die virtuellen Teilnehmer jeweils in einem Thread weiterzuschicken, wenn dann bei einem die Verarbeitung etwas länger dauert (z.B. weil in der Zwischenzeit ein Dateizugriff geschieht, der etwas dauert), können die anderen Pakete parallel weiterverarbeitet werden.
Das ist zwar an sich schön, aber macht es nicht einfacher, denn die Threads müssen ja vielleicht auch synchronisiert werden, aber das wäre schon machbar. Was mich aber noch mehr stört, ist dass wegen jeder Nachricht ein Thread ausgeführt wird - wie ist das von der Performance her? Klar kann ich einen Thread Pool verwenden, aber jeder Thread muss doch initialisiert werden, könnte das den Performancegewinn wieder beeinträchtigen? Im dümmsten Fall könnten ja pro Sekunde 1000 Threads gestartet / beendet werden, ist das zu heftig? Wäre es dann doch effizienter, die Nachrichten in einem Thread nacheinander abarbeiten zu lassen und dann lieber die Abarbeitung irgendwie zu optimieren?