使用我的线程实现程序失败?

时间:2010-12-10 22:27:26

标签: c++ multithreading

这是我在你的论坛上发表的第一篇文章,但我不确定我是否在问正确的地方? - 我可以在本节中发布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);

当我打开它时,程序只是崩溃了。 感谢帮助:)。

祝你好运, 本杰明。

3 个答案:

答案 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())来结束线程。