我的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的时候不被其他线程干扰,请问各位,怎么做才行?!
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的时候不被其他线程干扰,请问各位,怎么做才行?!
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);
}
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( )
{
}
每次调用testcallback()时,都在里面等待运行结果,运行结果的标志就是Meta_Init2_request。
所以当有新的线程调用testcallback(),你希望不影响前一个线程的标志变量Meta_Init2_request是吗?如果我理解的没有错的话
我建议传入指针,变量的定义在各自的线程中,这样就不会互相影响。