我的线程加载资源时常没有加载成功.有时后,加载又成功.不用线程,就一定成功.我在程序在做延迟处理,程序打开4S后,才读取线程,但还是出错,原因不明.我也没有在构造函数中,使用线程.
#include"ENthread.h"int ENthread::ENCreateThread(unsigned long& t, void(__cdecl *func)(void *), void* arglist)  
{  
cout<<"创建线程:func:"<<func<<endl;
return t = (unsigned long)_beginthread(func, 0, arglist);  
}  void ENthread::ENExitThread()
{
cout<<"结束线程"<<endl;
_endthread();}使用:
if(ENd3dOb->ENtimeOb->getSecond()>=m_game->GAParameterOb->ParDouble[49])
{
percent=1;
static int OFF=0;
if(OFF==0)
{
OFF=1;
unsigned long t;
ENthread::ENCreateThread(t,GALoading::LoadingThread, m_game);
}
}
//加载资源
void GALoading::LoadingThread(void *p)//加载游戏资源
{
m_game->GAMainOb->PublicResourceIni();//一次性加载资源
m_game->GAMainOb->GAMainIni();
m_game->GAMessageOb->GAMessageIni(); cout<<"资源读完"<<endl;
percent=1000;
if(percent==1000)
{
ENthread::ENExitThread();
}
}

解决方案 »

  1.   

        m_game->GAMainOb->PublicResourceIni();//一次性加载资源
        m_game->GAMainOb->GAMainIni();
        m_game->GAMessageOb->GAMessageIni();
    这些语句根本没有考虑并发访问的加锁问题,当然也可能无需加锁,取决于你的实现。断点跟踪一下吧。
      

  2.   

    我也做了加锁的处理.,效果是好了点,还是会出现原来 的问题,不知是否我做错了,但旧公司,用同样的方法,未出现过问题.它是没有加锁的. Static_m_game=m_game;
    Static_ENd3dOb=ENd3dOb;
     //   GALoadingOnEnter_1();
    // static unsigned long t=3333;
    // ENthread::ENCreateThread(t,GALoading::LoadingThread, Static_m_game);
    static unsigned long t;
    _beginthreadex(0,t,&LoadingThread,(unsigned int *)Static_m_game,0,0);
    cout<<"GALoading::OnEnter(void)"<<endl;unsigned int __stdcall GALoading::GALoadingOnEnter_1(void *param)
    {


    // CRITICAL_SECTION *tempSysCrs=ENd3dOb->getCriticalSection();//临界区
    CRITICAL_SECTION *tempSysCrs=Static_ENd3dOb->getCriticalSection();//临界区
    EnterCriticalSection(tempSysCrs);//临界区 char ss[100]="";
    char ss1[100]="";
    char ss2[100]="";
    int v=5;
    percent=2;
    Static_ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\resource-1.bmp","PIC-1");
    CountResource++;
    percent=20;
    Static_ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\resource-2.bmp","PIC-2");
    CountResource++;
    Static_ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\resource-3.bmp","PIC-3");
    CountResource++;
    Static_ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\resource-4.bmp","PIC-4");
    CountResource++;
    Static_ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\resource-4a.bmp","PIC-5");
    CountResource++;
    Static_ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\resource-1a.bmp","PIC-6");
    CountResource++;
    // ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\resource-2a.bmp","PIC-7");
    // CountResource++;
    /*
    strcpy(ss,"PIC-3");//大图纹理缓冲区名(纹理图)
    ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\plane-1.bmp",ss);
    CountResource++;
    strcpy(ss1,"PIC-4");//大图纹理缓冲区名(a图)
    ENd3dOb->ENresourceOb->ENImageBMPIni("resource\\public\\plane-1a.bmp",ss1);
    CountResource++;
    */
    /*
    for(int i=5;i<200;i++)
    {
    _stprintf(ss,"PIC-%d",i);
    ENd3dOb->ENresourceOb->ENImageBMPIni("state\\GALoading\\3.bmp",ss);
    }
    */

    Static_m_game->GAMainOb->PublicResourceIni();//一次性加载资源
    Static_m_game->GAMainOb->GAMainIni();
    Static_m_game->CompanyLogoOb->CompanyLogoIni();
    Static_m_game->BackGroundOb->BackGroundIni();
    Static_m_game->GAMessageOb->GAMessageIni();
    LeaveCriticalSection(tempSysCrs);
    // LeaveCriticalSection(&tempSysCrs1); cout<<"资源读完"<<endl;
    percent=1000;
    if(percent==1000)
    {
    // ENthread::ENExitThread();
    cout<<"退出线程1:"<<percent<<endl;
    _endthreadex(0);
    cout<<"退出线程2:"<<percent<<endl;
    }
    return 0;
    }
      

  3.   

    你看看是否是这篇文章所讲的问题:
    http://topic.csdn.net/u/20100116/12/7c711b81-1786-4fb9-975d-ea805325edce.html
      

  4.   

    这是边加载LOADING界面.边加载游戏资源,不能放到主线程,放在主线程,就变成所有资源加载源,才显示LOADING
      

  5.   

    这里是不用加LOCK的.临界区都不用设置.因为我在公司中,COPY来用的.公司都无加.以前都出现过资源加载出错,是因为线程创建在构造函数中.但我这里没有在构造函数中.