2016-06-08 3 views
1

Я использовал код на C++ давно, но сейчас решил вспомнить старые навыки и достижения некоторых новых: DТемы в классе C++

Сейчас я пытаюсь переписать мою программу C# в C++ и одна проблема возникла - Я не знаю, как управлять потоками или даже создавать их, используя методы класса и вызывающие методы из класса.

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); 
    } 
}; 

То есть образец, я нашел здесь, на StackOverflow, но Пустота нить() 'была пустая функция, я добавил код, приведенный выше, но нить, кажется, запуск и закрытие сразу.

+2

Есть ли причина, почему вы не используете 'станд :: thread' ? – Rakete1111

+0

Возможно, лучше использовать 'std :: thread' в качестве члена вашего класса. –

+0

Никогда не накладывайте указатель на другой тип. – molbdnilo

ответ

2

Я добавил код, приведенный выше, но поток, кажется, сразу начинается и закрывается.

Это потому, что вы не дождитесь, пока потоки не будут завершены в вашей основной теме.

Как от их documentation, вам нужно добавить что-то вроде

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

std::thread Для этого должен быть призыв к std::thread::join().


Я предпочел бы рекомендовал использовать std::thread в качестве члена MyObj класса:

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

Спасибо за ваши ответы. Использование std :: thread оказалось проще, чем использование класса протектора CLI.

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(); 
} 

Тема начинается с главного

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

Final версии (я надеюсь) двух методов в классе

+0

Можно спорить, если вы должны вызывать 'join()' from 'start() 'или, скорее, использовать деструкторный вызов класса (' secureProg'), который инкапсулирует этот материал. –

+0

пока что это работает, если что-то произойдет позже, я попытаюсь переписать это. сейчас я ищу, как прерывать/приостанавливать std :: thread ._. –

+0

Проблема в том, что 'return thread.get_id();' будет предоставлять идентификатор потока после его выполнения в целом. Скорее всего, это не то, что вы хотите. –