这是我在你的论坛上发表的第一篇文章,但我不确定我是否在问正确的地方? - 我可以在本节中发布C ++问题,还是像普通的编程部分一样? 无论如何,我的足够怀疑,让我们来解决我的问题:)。 在我的.h文件(thread.h)中,我有一个struct(RUNNABLE)和一个类(thread)。 'RUNNABLE'就像你实现和覆盖的接口,或者至少你覆盖它的虚拟'run()'void。然后创建一个'thread'实例并调用它的'start(void * ptr)'函数来启动该线程。传入一个以RUNNABLE作为基类的对象实例作为'start'函数的参数。 这一切看起来都很棒,但是我的实现崩溃了我的程序。 这是thread.h:
#include <process.h>
struct RUNNABLE{
virtual void run() = 0;
};
class thread{
public:
void start(void *ptr){
DWORD thr_id;
HANDLE thr_handl = (HANDLE)_beginthreadex(NULL, 0, thread_proc, ptr, 0, (unsigned int*)&thr_id);
}
private:
static unsigned int __stdcall thread_proc(void *param){
((RUNNABLE*)param)->run();
ExitThread(0);
return 0;
}
};
这是我的示例实现:
class test : RUNNABLE{
virtual void run(){
while(true){
dbText(0, 0, "hej");
}
}
};
test *obj = new test();
thread th;
th.start(obj);
当我打开它时,程序只是崩溃了。 感谢帮助:)。
祝你好运, 本杰明。
答案 0 :(得分:1)
test * obj = new test();
这是内存管理问题。什么时候 obj 被删除?线程实际开始运行可能需要一段时间,对象需要保持足够长的时间。我猜你有一些代码不在再次删除该对象的代码片段中。太快了。
唯一可以安全准确地删除对象的代码就是线程本身。
答案 1 :(得分:0)
我测试了它并且它运行得很好,可能你的dbText东西崩溃了,我用printf替换它(“hejdå”)。
答案 2 :(得分:0)
这对我来说运行良好:
#include <iostream>
#include <process.h>
#include <windows.h>
struct RUNNABLE{
virtual void run() = 0;
};
class thread{
public:
void start(void *ptr){
DWORD thr_id;
HANDLE thr_handl = (HANDLE)_beginthreadex(NULL, 0, thread_proc, ptr,
0, (unsigned int*)&thr_id);
}
private:
static unsigned int __stdcall thread_proc(void *param){
((RUNNABLE*)param)->run();
std::cout << "ending thread\n";
::ExitThread(0);
return 0;
}
};
class test : RUNNABLE{
virtual void run(){
for(unsigned int u=0; u<10; ++u){
std::cout << "thread\n";
}
}
};
int main()
{
test *obj = new test();
thread th;
th.start(obj);
std::cout << "giving thread some time\n";
::Sleep(5000);
std::cout << "ending process\n";
return 0;
}
但是,您应该调用_endthreadex()
(而不是EndThread()
)来结束线程。