for(i=0;i<1;i++)
{
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)proc,&i,0,&pid);
}void proc(LPVOID pParam)
{
int num=*((int *)pParam);
}num的值好像不是0,奇怪了?

解决方案 »

  1.   

    应该这么写:
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)proc,(LPVOID)&i,0,&pid);
      

  2.   

    我已经加了(LPVOID),但是num的值是1
      

  3.   

    num的值好像不是0,奇怪了?
    这很正常,因为,
    for(i=0;i<1;i++)
    {
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)proc,&i,0,&pid);
    }
    起了几个线程,此时,线程有可能还没启动执行,主要是异步的原因。你跟踪的,可能是第二个线程,也就是说,第二个线程比第一个启动的线程先启动。而这种情况是很普遍的。那么,你调试的时候,传进来的参数不一定就是0,有可能是1,或2或3。
      

  4.   

    你可以这样测试,起动的时候,得到CreateThread线程的handle,然后在线程函授里GetCurrentThread(),取出handle和启动的handle比较一下,这样,结果就很明显了。就知道是哪个线程进来了。当然就可以猜测到num==?了。good luck.
      

  5.   

    我不是调试,使这样的:
    void proc(LPVOID pParam)
    {
    int num=*((int *)pParam);
             CString s;
             s.Format("%d",num);
             ::MessageBox(NULL,s,"hummel",NULL);
    }
    我是直接运行程序。num的值在一个messagebox中显示为1
      

  6.   

    没看出什么不对的 
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)proc,(LPVOID)&0,0,&pid); 这样应该没问题吧. 是不是你循环里还有别的代码.i 改变了
      

  7.   

    在说我实际只开了一个线程 :for(i=0;i<1;i++)
    没理由啊??
      

  8.   

    回复人: seilfer2000(鬼手韩特) =================================
    没有别的代码,你可以试试看,就以上的代码,在非调试环境下运行一下。
      

  9.   

    他的循环是 for(i=0;i<1;i++) 不会起很多线程啊
      

  10.   

    for(i=0;i<1;i++)
    { int a=i;;
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)proc,&a,0,&pid);
    }
    你这样试试看应该不会变了吧,参数传的I的地址,而你新起的线程运行时I已经成1了,不知道我想的对不对
      

  11.   

    明白了,因为传得是i的地址,所以,proc中去寻找pParam的值的时候,主程序中已经对i的值++了,所以是1,当num找到i的地址时,已经是1了  :)    汗不过有什么简单的方法可以保证正确的传参数呢????????????