MainWindow von Interface Polling (dll) entkoppeln
Verfasst: 31. März 2010 13:33
Hallo,
nachdem ich nun trotz Lesen der Manuals und Bücher zu Qt an einem Punkt hänge, möchte ich dann doch mal hier im Forum um Rat fragen...
Mein Problem: Ich habe ein Interface, zu dem der Hersteller eine Lib, Header und eine dll mitliefert. Um die dll zu verwenden, habe ich eine Klasse erstellt
nterfaceCom), die mit QLibrary diese dll lädt und mir die benötigten Funktionen daraus bereitstellt (als Methode der Klasse).
Dann habe ich eine zweite Klasse, die das MainWindow funktional abbildet (ui mit QtDesigner erstellt) - so wie man das in der Literatur als Basis-Beispiel findet.
In der main() werden beide Klassen dann als Objekt erzeugt und ich übergebe den Pointer meiner InterfaceCom an das MainWindow.
Funktional läuft in meiner InterfaceCom ein QTimer mit 10ms, der beim Auslösen den Empfangspuffer meines Interface ausliest (Methode der Klasse) und die Daten dann in einem Array (public) der Klasse ablegt.
Diese Daten liest dann das MainWindow alle 250ms und aktualisiert damit die Felder/Widgets des Fensters. Die 250ms habe ich ebenfalls mit einem QTimer realisiert. Beide QTimer sind mit signal/slot mit den Methoden verknüpft.
Mein Problem: Sobald ich den QTimer für den poll-Betrieb des Interface starte, kann ich die Widgets des MainWindow bedienen und meine Daten werden auch empfange, klicke ich aber ausserhalb des Fensters, beendet sich meine Applikation. Auch wenn ich mit der Maus das Fenster verschiebe, beendet sie sich.
Wenn ich den Timer auf 30ms oder mehr setze, stürzt sie auch ab... obwohl die 2 Telegramme/10ms locker zu verarbeiten wären.
Beim Debuggen bekomme ich eine SIGSEGV Fehlermeldung von Windows, was auf ein Speicherzugriffsproblem vermuten läßt ?
Ich vermute, dass es damit zusammenhängt, dass alles in einer Ereignisverarbeitung des MainWindow hängt und dann das Lesen zum Blockieren führt. Meine Frage ist nun, wie ich das jetzt entkoppeln kann. Meine Befürchtung ist, wenn ich QThreads verwende, dass ich da ggf. nur den Bottleneck der Datenübergabe an eine andere Stelle verlagere...
Wie würdet Ihr da konzeptionell vorgehen ?
Für Tipps oder auch Verweise/Links auf die gute Literatur, wäre ich sehr dankbar.
In der späteren Zielapplikation, ein Roboter, werde ich noch mehr Interfaces und Daten verarbeiten müssen; wenn ich jetzt schon bei den paar Daten konzeptionell Probleme habe, brauch ich die anderen Interfaces erst garnicht anbinden, bzw. sehe beim Roboter vielleicht gleich noch einen Griff zum Schieben vor...
Vielen Dank jedenfalls und Gruß,
Marcus
nachdem ich nun trotz Lesen der Manuals und Bücher zu Qt an einem Punkt hänge, möchte ich dann doch mal hier im Forum um Rat fragen...
Mein Problem: Ich habe ein Interface, zu dem der Hersteller eine Lib, Header und eine dll mitliefert. Um die dll zu verwenden, habe ich eine Klasse erstellt
Dann habe ich eine zweite Klasse, die das MainWindow funktional abbildet (ui mit QtDesigner erstellt) - so wie man das in der Literatur als Basis-Beispiel findet.
In der main() werden beide Klassen dann als Objekt erzeugt und ich übergebe den Pointer meiner InterfaceCom an das MainWindow.
Funktional läuft in meiner InterfaceCom ein QTimer mit 10ms, der beim Auslösen den Empfangspuffer meines Interface ausliest (Methode der Klasse) und die Daten dann in einem Array (public) der Klasse ablegt.
Diese Daten liest dann das MainWindow alle 250ms und aktualisiert damit die Felder/Widgets des Fensters. Die 250ms habe ich ebenfalls mit einem QTimer realisiert. Beide QTimer sind mit signal/slot mit den Methoden verknüpft.
Mein Problem: Sobald ich den QTimer für den poll-Betrieb des Interface starte, kann ich die Widgets des MainWindow bedienen und meine Daten werden auch empfange, klicke ich aber ausserhalb des Fensters, beendet sich meine Applikation. Auch wenn ich mit der Maus das Fenster verschiebe, beendet sie sich.
Wenn ich den Timer auf 30ms oder mehr setze, stürzt sie auch ab... obwohl die 2 Telegramme/10ms locker zu verarbeiten wären.
Beim Debuggen bekomme ich eine SIGSEGV Fehlermeldung von Windows, was auf ein Speicherzugriffsproblem vermuten läßt ?
Ich vermute, dass es damit zusammenhängt, dass alles in einer Ereignisverarbeitung des MainWindow hängt und dann das Lesen zum Blockieren führt. Meine Frage ist nun, wie ich das jetzt entkoppeln kann. Meine Befürchtung ist, wenn ich QThreads verwende, dass ich da ggf. nur den Bottleneck der Datenübergabe an eine andere Stelle verlagere...
Wie würdet Ihr da konzeptionell vorgehen ?
Für Tipps oder auch Verweise/Links auf die gute Literatur, wäre ich sehr dankbar.
In der späteren Zielapplikation, ein Roboter, werde ich noch mehr Interfaces und Daten verarbeiten müssen; wenn ich jetzt schon bei den paar Daten konzeptionell Probleme habe, brauch ich die anderen Interfaces erst garnicht anbinden, bzw. sehe beim Roboter vielleicht gleich noch einen Griff zum Schieben vor...
Vielen Dank jedenfalls und Gruß,
Marcus