我创建了一个类,类的初始化函数创建了一个线程(调用CreateThread),我现在想声明这个类的多个对象,却因为CreateThread而失败,因为CreateThread创建的所有线程的首地址相同,也就是一个线程重复被创建。不知各位有没有遇到这样的问题,各位是如何解决的,谢谢
//base.h
Class Base
{
private:
    HANDLE hThread;
public:
    Base();
    ~Base();
};
//base.cpp
DWORD WINAPI ThreadProc(void* arg)
{
//////////////////
   //add code
   return 0;
}
Base::Base()
{
    hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL);
}Base A,B,C;

解决方案 »

  1.   

    Base::Base()
    {
        hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL);
        CloseHandle(hThread);
    }
      

  2.   

    创建完线程后立即释放核心对象,不要等超作系统去清理,这样会造成resource leaks
      

  3.   

    还有 hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL); 里面的this是代表什么意思?这里我有点不明白,MSDN上说这个是新线程函数的参数,你这里用this是什么意思呢???
      

  4.   

    this是指向Base类的指针,因为线程要用到Base类的公用成员函数。我这些线程不可能立即释放,而且除非程序结束运行,否则运行几天都不可能释放内核对象,所以我不可能调用CloseHandle()释放内核句柄,又没有别的办法
      

  5.   

    我想到的一个办法是这样:
    先定义一个空的指针
    DWORD (WINAPI* ThreadProc)(void* arg);
    在调用CreateThread之前先给线程代码(包括数据)分配内存,
    (我计划用new,但是我不知道线程代码段的首地址和大小)。
    然后把内存的首地址赋给ThreadProc,用完之后释放内存。
      

  6.   

    are you in win 98?
    in win98, the last paremter can not is NULL
      

  7.   

    我是在Win2K下,最后那个参数能不能为空都无关紧要,关键是不能用这个方法启动多个线程
      

  8.   

    i test your code in my computer.
    can create three thread.
      

  9.   

    因为CreateThread创建的所有线程的首地址相同?
    your meaning is all thread use the address of ThreadProc?i don't think so!
      

  10.   

    in my test project,i do some change like this
    DWORD WINAPI ThreadProc(void* arg)
    {
       while(1)
      {
        sleep(1000);
      }
      
       return 0;
    }can create three thread too!
      

  11.   

    各个线程的数据和代码在同一个空间
    it's wrong!the code's address of the three threads  is same( all is the adress of ThreadProc)
    but the data's address is differnt.
      

  12.   

    我用printf函数输出有问题,用cout输出就正常了,谢谢你 yym314(小鸟)
      

  13.   

    看来meishi (meishi) 兄对核心对象得概念比较模糊,这里我说明一下,线程作为一种核心对象,比较特殊,因为线程核心对象用用到得那个线程也会另核心对象开启。因此,线程对象得默认引用计数是2,当你调用CloseHandle()时,引用计数下降1,当线程结束时,引用计数再降1。只有当两件事都发生后,这个对象才被真正清除。
        所以CreateThread()函数标准的用法是,创建完后立即CloseHandle(),我很少看到程序员注意这个事情,而很多高级程序员也不知道此类问题。所以在这里说明一下。