- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: Multithread in C++ in Klassen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.04.2016
    Beiträge
    10

    Multithread in C++ in Klassen

    Anzeige

    Praxistest und DIY Projekte
    Hallo Community,

    nachdem ich schon seit längerem mitgelesen habe, habe ich nun auch mal ein Problem an dem ich nicht weiter komme.
    Ich hoffe ich habe das richtige Unterforum.

    Compiler: Visual Studio 2013 C++

    Im Rahmen einer Projektarbeit sollen wir an der FH den VolksBot des Fraunhofer Institut in bewegung setzen.
    Zum auslesen der seriellen Schnittstellen wollte ich eigene Threads benutzen.

    Code:
    CommSeriell::CommSeriell(int a)
    {
    	printf("\nAlle Threads starten...\n");
    
    	// Alle Threads starten
    	int index = 1;
    	hThread[0] = CreateThread(NULL,						// Sicherheitsinfos
    		0,							// Größe des Stack
    		CommSeriell::RecieveGPS,				// Threadfunktion
    		(LPVOID)index,			// 32-bit paramter der Threadfunktion übergeben wird
    		0,							// Creation Flags, 0=sofort starten.
    		&dwThreadID[0]);	// Id speichern
    }
    
    DWORD WINAPI CommSeriell::RecieveGPS(LPVOID data)
    {
    	initComPort();  //Öffnen des ComPort
    	recieveComPort();  //Empfangen und auswerten der Daten
    	CloseHandle(hComm);//Closing the Serial Port  //Schliesen des ComPort
    
    	return((DWORD)data);
    }
    Ich würde gerne in einer Klasse einen Thread starten bekomme das allerdings nicht hin.
    Habe jetzt schon des öfteren gelesen dass man hierbei keine Funktion einer Klasse verwenden kann.
    Allerdings benötige ich mehrere Daten aus der Klasse und würde auch gerne mehrere Daten zurückgeben.

    Kennt hierzu jemand einen Lösungsweg oder eine Alternative?

    MfG
    Florian

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Hallo,

    und willkommen im Forum.

    Zitat Zitat von FlorianKr Beitrag anzeigen
    Habe jetzt schon des öfteren gelesen dass man hierbei keine Funktion einer Klasse verwenden kann.
    Das geht schon, allerdings hat man dabei das Problem, dass Memberfunktionen ja implizit this als ersten Parameter übergeben bekommen. Man muss da eventuell mit einer statischen Memberfunktion und allerlei Casts aushelfen. Das kriege ich jetzt aus dem Kopf nicht hin, müsste ich auch nachschauen.

    Modernes C++ kennt Multithreading. Das geht auch in VC++ 2013
    http://en.cppreference.com/w/cpp/thread
    wir hatten da kürzlich hier mal was zu
    https://www.roboternetz.de/community...ghlight=thread

    Wenn es unbedingt die WinAPI sein muss, wie in deinem Code oben: In den Büchern von Jeffrey Richter ("Windows via C/C++") steht, man solle in C++ CreateThread nie direkt aufrufen, weil dabei einige Dinge der Laufzeitbibliothek nicht initialisiert werden. Ob das immer noch so ist, kann ich nicht sagen. Ich würde trotzdem seine Empfehlung weitergeben, besser _beginthread oder _beginthreadex zu nehmen. Microsoft nimmt heute in seinen eigenen Beispielen aber eher std::thread.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    Du kannst eine Thread Funktion in einer Klasse nutzen. Hier ein Bsp.

    Code:
    Test::Test()
    {
    	// create the worker thread
    	m_run.store(true);
    	m_thread = std::thread(std::bind(&Test::execute, this));
    }
    Test::~Test()
    {
    	m_run.store(false);
    	if (m_thread.joinable()
    	{
    		m_thread.join();
    	}
    
    }
    void Test::execute()
    {
    
    	while (m_run.load())
    	{
    	}
    }
    
    class Test
    {
    public:
    	Test();
    	~Test();
    private:
    	// the thread function
    	void execute();
    
    	// the thread
    	std::atomic<bool> m_run;
    	std::thread m_thread;
    };

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    26.04.2016
    Beiträge
    10
    Hallo,
    vielen Dank für die raschen Antworten. Habe mir mal die links angeschaut und auch die Codes aus dem anderen Thread.
    Desweiteren habe ich noch auf VS2015 umgestellt.

    Gerade habe ich mal versucht meinen Code nach dem Beispiel von schorsch_76 umzuschreiben,
    bekomme dabei allerdings den Fehler "C2039 'atomic': is not a member of std" gefolgt von weiteren Fehlern in dieser Zeile.
    Desweiteren spuckt er bei jedem m_run einen Fehler aus, was aber denke ich daran liegt dass er die Deffinition nicht nimmt.


    Code:
    	std::atomic<bool> m_run;
    Anbei noch mein geänderter Code:
    Code:
    //CommSeriell.cpp
    
    CommSeriell::CommSeriell()
    {
    	m_run.store(true);
    	m_thread = std::thread(std::bind(&CommSeriell::theThread, this));
    }
    
    
    CommSeriell::~CommSeriell()
    {
    	m_run.store(false);
    	if (m_thread.joinable()
    	{
    		m_thread.join();
    	}
    }
    
    void CommSeriell::theThread()
    {
    	initComPort();
    	while (m_run.load())
    	{
    		recieveComPort();
    	}
    	
    	CloseHandle(hComm);//Closing the Serial Port
    	printf("\n +==========================================+\n");
    };
    Code:
    //CommSeriell.h
    
    #pragma once
    class CommSeriell
    {
    public:
    	CommSeriell();
    	~CommSeriell();
    
    private:
    	std::atomic<bool> m_run;
    	std::thread m_thread;
    
    	HANDLE hComm;                          // Handle to the Serial port
    	wchar_t  ComPortName[7];  // Name of the Serial port(May Change) to be opened,
    	BOOL  Status;                          // Status of the various operations 
    	DWORD dwEventMask;                     // Event mask to trigger
    	char  TempChar;                        // Temperory Character
    	char  SerialBuffer[4096];               // Buffer Containing Rxed Data
    	DWORD NoBytesRead;                     // Bytes read by ReadFile()
    	int i = 0;
    	int error = 0;
    
    	BOOL initComPort();
    	BOOL setRecieveMask();
    	BOOL recieveComPort();
    	BOOL readNMEA();
    	void theThread();
    
    };
    MfG
    Florian

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Zitat Zitat von FlorianKr Beitrag anzeigen
    bekomme dabei allerdings den Fehler "C2039 'atomic': is not a member of std" gefolgt von weiteren Fehlern in dieser Zeile.
    Da fehlt dann wohl ein #include <atomic>

  6. #6
    Unregistriert
    Gast
    Oh ja das war der fehler, danke.

    Allerdings bringt er mir jetzt noch einen letzten Fehler:

    Error C2280 'CommSeriell::CommSeriell(const CommSeriell &)': attempting to reference a deleted function ConsoleApplication1 c:\program files (x86)\microsoft visual studio 14.0\vc\include\type_traits 1466

    Beim Doppelklick darauf öffnet sich eine Datei mit dem Namen type_traits.

    Florian

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    26.04.2016
    Beiträge
    10
    Habe meinen Fehler gefunden.
    Hatte noch einen alten Threadaufruf in der Hauptschleife vom ausprobieren.

    Jetzt funktioniert das ganze so wie ich es mir vorgestellt habe.

    Vielen Danke für die schnelle Hilfe
    Florian

Ähnliche Themen

  1. Warum keine Klassen für Ein-/Ausgabe?
    Von p_mork im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 17.03.2007, 15:42
  2. (LEGO MINDSTORMS) lejos Klassen Facharbeit
    Von George Dorn im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 01.03.2006, 17:29
  3. Multithread in Basic?
    Von Sommer im Forum Software, Algorithmen und KI
    Antworten: 4
    Letzter Beitrag: 27.12.2005, 15:50

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test