QT Multithreading

03/03/2017 21:09 Bombasticx3#1
Hey yo,

habe folgendes Problem:

Ich möchte Multithreading in Qt 5.8 machen in C++.
Dabei habe ich eine Methode die auf Knopfdruck auf der GUI eine While-Schleife aufruft.
Danach wird die GUI unbrauchbar und stürzt ab.
Jedoch soll auf erneuten Knopfdruck die Methode beendet werden.

Worker bei Click auf Button aufrufen.
While Schleife starten.
Absturz.

Meine Überlegeung:
Window in 1. Thread
Methode in 2. Thread
Problem -> Window mit a.exec im Thread starten ist nicht möglich, da a.exec im gleichen Thread wie die Main-Methode sein muss.

Deswegen bin ich jetzt ziemlich planlos.

Code:
main.cpp
Window aufruf

mainwindow.cpp
Methode on_click(){worker}

mainwindow.h

worker(){while(true)
foo();};
MfG Bombasticx3
03/03/2017 22:24 Devsome#2
#moved
03/03/2017 22:25 qqdev#3
Starte einfach aus dem GUI-Thread heraus einen neuen Thread.


Gruß

qqdev
03/08/2017 20:25 lua god#4
[Only registered and activated users can see links. Click Here To Register...]
da ist doch alles was du brauchst?
03/08/2017 21:02 warfley#5
Solange es simpel bleibt kannst du
Code:
QApplication::processEvents()
verwenden, das unterbricht kurz und feuert alle events die sich bis dahin in der Queue befinden. Wenn du das in der Schleife aufrufst können dann währenddessen der Code aus z.B. deinem Abbrechen button ausgeführt werden, und nachdem alle events abgearbeitet sind returned die Funktion wieder und deine schleife geht weiter.

Natürlich musst du dabei aufpassen, und niemals zu viel /blockierenden code in den Events ausführen. Aber gleichzeitig vermeidest du die Probleme mit multithreading die wirklich beschissen zu finden und zu Debuggen sind
03/12/2017 09:01 Bombasticx3#6
Quote:
Originally Posted by warfley View Post
Solange es simpel bleibt kannst du
Code:
QApplication::processEvents()
verwenden, das unterbricht kurz und feuert alle events die sich bis dahin in der Queue befinden. Wenn du das in der Schleife aufrufst können dann währenddessen der Code aus z.B. deinem Abbrechen button ausgeführt werden, und nachdem alle events abgearbeitet sind returned die Funktion wieder und deine schleife geht weiter.

Natürlich musst du dabei aufpassen, und niemals zu viel /blockierenden code in den Events ausführen. Aber gleichzeitig vermeidest du die Probleme mit multithreading die wirklich beschissen zu finden und zu Debuggen sind
Hab es mit CreateThread() gelöst.
Mit deiner Methode, hätte es nicht ganz funktioniert.
03/12/2017 22:14 qqdev#7
Benutze lieber std::thread oder QThread u.ä.
04/16/2017 00:27 Cøre#8
Add mich mal in Skype: zenox.cod kann dir weiter helfen. Arbeite seit langem mit Qt :)
04/18/2017 10:07 Devsome#9
Quote:
Originally Posted by Cøre View Post
Add mich mal in Skype: zenox.cod kann dir weiter helfen. Arbeite seit langem mit Qt :)
Hättest du die antworten gelesen, hättest du gesehen das er es gelöst hat. Warum in Skype adden wenn wir eh schon in einem Forum sind.
04/19/2017 20:25 _asm#10
auch wenn er das problem nicht gelöst hätte, solltest du trotzdem deine hilfestellung/lösung hier im thread posten und nicht privat.
außerdem würde ich mir lieber die offizielle [Only registered and activated users can see links. Click Here To Register...] durchlesen.
04/22/2017 00:58 Remix v311#11
Quote:
Originally Posted by qqdev View Post
Benutze lieber std::thread oder QThread u.ä.
QThread wrapt std::thread sowieso
generell wrappen diese "standard" klassen die STL
bis auf die GUI libs sind die qt klassen auch ziemlich unnötig
04/22/2017 16:52 th0rex#12
Quote:
Originally Posted by Remix v311 View Post
QThread wrapt std::thread sowieso
generell wrappen diese "standard" klassen die STL
bis auf die GUI libs sind die qt klassen auch ziemlich unnötig
Herzlichen Glückwunsch, du hast es erkannt! Eine library die 1995 geschrieben wurde und wahrscheinlich seit dem support für threads hat wrappt offensichtlich etwas was 2011 offiziell zum c++ standard hinzugekommen ist.

Ein weiteres Indiz für deine super Vermutung ist natürlich, dass überall in dem source code von der thread klasse von qt man nur sachen von std::thread liest, und nicht etwa eigene implementierungen wie [Only registered and activated users can see links. Click Here To Register...], die pthread nutzt, oder [Only registered and activated users can see links. Click Here To Register...] die beginthread nutzt. Wie man sieht, überall nur std::thread! Ich finde es super wie du so gut informierte Beiträge abgibst, weiter so!
04/23/2017 12:26 Remix v314#13
Quote:
Originally Posted by C0untLizzi View Post
Herzlichen Glückwunsch, du hast es erkannt! Eine library die 1995 geschrieben wurde und wahrscheinlich seit dem support für threads hat wrappt offensichtlich etwas was 2011 offiziell zum c++ standard hinzugekommen ist.

Ein weiteres Indiz für deine super Vermutung ist natürlich, dass überall in dem source code von der thread klasse von qt man nur sachen von std::thread liest, und nicht etwa eigene implementierungen wie [Only registered and activated users can see links. Click Here To Register...], die pthread nutzt, oder [Only registered and activated users can see links. Click Here To Register...] die beginthread nutzt. Wie man sieht, überall nur std::thread! Ich finde es super wie du so gut informierte Beiträge abgibst, weiter so!
ok mein fehler
bin davon ausgegangen dass es so ist, weil es bei vielen klassen und funktionen so ist
hätte es vorher überprüfen sollen
wie auch immer, habe kein problem damit fehler einzugestehen
04/23/2017 13:33 th0rex#14
Kannst du mal klassen oder funktionen nennen bei denen sie nur sachen ausm standard wrappen ? Habe bis jetzt nur bei atomics was gefunden wo deren code nicht mehr tut als das im standard und sie auch den standard nutzen.