2016-06-08 8 views
1

habe ich auf C kodieren ++ vor langer Zeit, aber nun beschlossen, alte Fähigkeiten zu erinnern, und einige neue zu erreichen: DThemen in C++ Klasse

Vorerst Ich versuche, meine C# Programm in C++ und ein Problem aufgetreten ist neu zu schreiben - Ich weiß nicht, wie ich Threads verwalten oder sogar erstellen kann, indem ich Klassenmethoden verwende und Methoden aus der Klasse aufruft.

class MyObj { 
private: 
    void thread() { 
     while (true) { 
      std::string a; 
      cin >> a; 
     } 
    } 

    static DWORD static_entry(LPVOID* param) { 
     MyObj *myObj = (MyObj*)param; 
     myObj->thread(); 
     return 0; 
    } 

public: 
    void start() { 
     CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)static_entry, this, 0, NULL); 
    } 
}; 

Das Beispiel ist, habe ich hier gefunden, auf Stackoverflow, aber ‚Leerer Thread()‘ war leer Funktion, ich habe Code hinzugefügt, oben gegeben, aber der Faden scheint und in der Nähe sofort zu starten.

+2

Gibt es einen Grund, warum Sie nicht verwenden 'std :: thread' ? – Rakete1111

+0

Es ist wahrscheinlich besser, 'std :: thread' als Mitglied Ihrer Klasse zu verwenden. –

+0

Werfen Sie niemals einen Funktionszeiger auf einen anderen Typ. – molbdnilo

Antwort

2

Ich habe oben angegebenen Code hinzugefügt, aber der Thread scheint sofort zu starten und zu schließen.

Das liegt daran, dass Sie nicht darauf warten, dass die Threads in Ihrem Hauptthread enden.

Wie aus ihrem documentation, werden Sie so etwas wie

// Wait until all threads have terminated. 
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE); 

Für std::thread dieser sollte ein Aufruf std::thread::join() sein hinzufügen müssen.


Ich würde eher mit std::thread als Mitglied der MyObj Klasse empfehlen:

class MyObj { 
private: 
    void thread_fn() { 
     while (true) { 
      std::string a; 
      cin >> a; 
     } 
    } 

    std::thread t; 

public: 
    void start() { 
     t = std::thread(&MyObj::thread_fn,*this); 
    } 
    ~MyObj() { 
     if(t.joinable()) 
      t.join(); 
    } 
}; 
1

Dank für Ihre Antworten danken. Mit std :: thread erwies sich als einfacher als CLI Tread-Klasse.

static void input() { 
    while (true) { 
     std::string a; 
     cin >> a; 
     secureProg::execute_command(a); 
    } 
} 

auto start() { 
    std::thread thread(secureProg::input); 
    thread.join(); 
    return thread.get_id(); 
} 

Thema ab Haupt

secureProg a; 
    auto thread_ptr = a.start(); 

Endfassung (hoffe ich) von zwei Methoden innerhalb der Klasse

+0

Es ist fraglich, wenn Sie 'Join()' von 'start() aufrufen sollten 'oder verwenden Sie lieber einen Destruktoraufruf einer Klasse (' secureProg'), der dieses Zeug einkapselt. –

+0

wie es jetzt funktioniert, wenn etwas später auftritt, werde ich versuchen, dies neu zu schreiben. jetzt suche ich wie std :: thread ._ zu unterbrechen/zu suspendieren. –

+0

Das Problem ist, dass 'return thread.get_id();' die Thread-ID liefert, nachdem sie insgesamt ausgeführt wurde. Das ist höchstwahrscheinlich nicht das, was du willst. –