我的DLL文件
head:------------------------------
int testcallback(int timeout);
main:------------------------------
void cbfunc(const int mr);//bool Meta_Init2_request;
__declspec(thread) bool Meta_Init2_request;
int testcallback(int timeout)
{
int vi;
vi = META_Init2(cbfunc);
DWORD starttick;
starttick   =  GetTickCount();
while ((GetTickCount()-starttick) < (DWORD)timeout)
{   
if(Meta_Init2_request)break;
Sleep(100);
}   
if(Meta_Init2_request)
return 1+timeout;
else
return 0+timeout;}void cbfunc(const int mr)//回调
{
Meta_Init2_request = true;
}主要是Meta_Init2_request变量问题!(其中DLL函数,META_Init2函数会建立新线程)如果通过bool Meta_Init2_request;声明变量,那么在EXE调用进程内都会存在;
如果通过__declspec(thread) bool Meta_Init2_request;声明变量,会受到META_Init2函数新线程的干扰。我只想每次调用testcallback,这个Meta_Init2_request就只在这次调用过程中有效,多线程调用testcallback的时候不被其他线程干扰,请问各位,怎么做才行?!

解决方案 »

  1.   

    线程同步,如果是多线程对同一个变量进行操作,请注意线程同步,线程同步有很多方法,可以用CriticalSection,建议搜索一下线程同步的方法.
      

  2.   

    static LONG volatile   Meta_Init2_request;
    const LONG myTrue = 1;
    int   testcallback(int   timeout) 

    int   vi; 
    vi   =   META_Init2(cbfunc); 
    DWORD   starttick; 
    starttick       =     GetTickCount(); 
    while   ((GetTickCount()-starttick)   <   (DWORD)timeout) 
    {       
    if(myTrue == Meta_Init2_request)break; 
    Sleep(100); 
    }       
    if(myTrue == Meta_Init2_request) 
    return   1+timeout; 
    else 
    return   0+timeout; } void   cbfunc(const   LONG   mr)//回调 

    ::InterlockedExchange(&Meta_Init2_request, mr); 

      

  3.   

    谢谢楼上两位,我都试过了,还是不能达到EXE的A\B线程先后调用同一testcallback函数,互相不冲突我临时用CCriticalSection临界等待解决,但我们头认为这样A运行B等待的做法不可取,,,是否有更好的方法解决?请大家帮小弟考虑下!下面是新的代码:
    CEvent NvRamEvent;
    CCriticalSection critical_section;

    void  __stdcall CNF_NvRamInit(const int mr)
    {
    NvRamEvent.SetEvent();
    }int CNvRamInit::NvRamInit(int timeout,int cbtimeout)
    {
    critical_section.Lock();
        NvRamEvent.m_hObject=CreateEvent(NULL, TRUE, FALSE, NULL);
    error = META_Init2(::CNF_NvRamInit,cbtimeout);
        if(error!=0)
    {
    return 1;
    }
    if(::WaitForSingleObject(NvRamEvent.m_hObject,timeout) != WAIT_OBJECT_0)
    {
    return 2;
    }
    critical_section.Unlock();
    return error;
    }
    int testcallback(int timeout,int cbtimeout)
    {
    CNvRamInit c;
    int ret;
    ret=c.NvRamInit(timeout,cbtimeout);
    return timeout;
    }
    CNvRamInit::CNvRamInit( void )
    {
    }CNvRamInit::~CNvRamInit( )
    {
    }
      

  4.   

    不是很明白你的意思。按照我的理解说一下
    每次调用testcallback()时,都在里面等待运行结果,运行结果的标志就是Meta_Init2_request。
    所以当有新的线程调用testcallback(),你希望不影响前一个线程的标志变量Meta_Init2_request是吗?如果我理解的没有错的话
    我建议传入指针,变量的定义在各自的线程中,这样就不会互相影响。
      

  5.   

    我重写了Event类,增加了一个数组,并且做了一个Find,问题解决