我创建三十个线程如下Bool Loop=true;
......
for (i=0;i<=30;i++)
{
AfxBeginThread((AFX_THREADPROC)ChnExter,this);
}
......UINT ChnExter(LPVOID pParam)
{
CTwVoiceDlg *ptwVoicedlg=(CTwVoiceDlg *)pParam;

          Bool Test=true

          while(Loop==true)
{
           if (test==true)
           {
              .......
              test=false;
            }
           else
           {
              .......
              test=true;            }
  Sleep(100);
}
AfxEndThread(0);
return 0;
}这样写后好象调试是对的,线程好象是创建了30个,但是从1到29个都只执行了一次,执行到test==true后的语句就停止了,好象线程就被挂起了似的,只有最后的一个线程会在那个While里面循环,请教各位这是为什么?怎么解决?

解决方案 »

  1.   

    你的Loop是不是全局变量?
    你的Loop最好一个线程一个,在参数中传入,还有在线程内部调用AfxEndThread(0)干嘛。
      

  2.   

    首先你得肯定是线程停止了吗,看看任务管理器中县城的个数可以知道,再次呢肯定当时执行的是第30个县城吗,呢友没做标记作么表明他就是第30个县城,而不是其他的县城呢,要知道在某个时间片运行的肯定只有一个县城,下面是个简单的例子很好的说明了多线程运行的情况
    #include <windows.h>DWORD myThread(DWORD param);main()
    {

    HANDLE h=NULL;
    int i;
    int TID;

    for(i=0;i<30;i++)
    {
    h=CreateThread(NULL,0,(void *)&myThread,i,0,&TID);
    if (h) CloseHandle(h);
    }
    _getch();
    printf("press any key to end.\n");


    }
    DWORD myThread(DWORD param)
    {

    while(1)
    {
    printf("%d.\n",param);
    Sleep(1000);

    }

    return 0;
    }
      

  3.   

    你的这段代码 错误很多,我在这里就不说了,我说一下如何启动多条线程吧你要启动多条线程和相应的话路相联系,那么你在启动的时候必须给线程函数传递不同的参数
    起码你的每条话路的序号和板卡号就应该不同,你可以像这样来启动你的30条线程
    for (int nBoard = 0; nBoard < BOARD_NO; nBoard ++){
        for (int nTrunk = 0; nTrunk < MAX_LINE; nTrunk ++){
    CString temp; temp.Format("%d %d", nBoard, nTrunk);
    AfxBeginThread(LineControl, &temp, NULL);
    Sleep(1000);
        }
    }
    至于线程函数就是每个话路的功能了,没有什么特殊!
      

  4.   

    参数是this传的
    CTwVoiceDlg *ptwVoicedlg=(CTwVoiceDlg *)pParam;
    可以取到所需要的参数
      

  5.   

    呵呵,单单这样是找不到问题的,给个 Demo Show 一 Show 明白
      

  6.   

    我跟你一样遇到过这个问题,我启动多线程的时候,第一个线程没有启动,调了半天都没有结果,最后干脆Sleep(200),然后再运行,这样就ok了,至于别的,希望你看看我发的帖子,很多高手帮助解决啦
    http://expert.csdn.net/Expert/topic/2634/2634229.xml?temp=.8815119