我以前在C ++上编码,但现在决定回忆旧技能并实现一些新技能:D
现在我正在尝试用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上但是'void thread()'是空函数,我已经添加了代码,如上所示,但线程似乎立即启动和关闭。
答案 0 :(得分: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 :(得分:1)
感谢您的回答。 使用 std :: thread 比使用CLI Tread类更容易。
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();
}
线程从 main
开始secureProg a;
auto thread_ptr = a.start();
最终版本(我希望)在类
中的两个方法