回调函数于类共享变量问题。。。 如题,为了让用IE5.0的人也能看见题目,把内容发到第一贴。谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在WinInet编程我用了InternetCallbackFunc回调来实现异步调用,但是遇到一个问题,我很菜,找不到好的解决的方法。请大家指教指教。我写了一个CWebGrabEx类,没有用MFC,在初始化时有m_pOldCallback = ::InternetSetStatusCallback( m_hSession, (INTERNET_STATUS_CALLBACK) InternetCallbackFunc );在回调函数:void CALLBACK CWebGrabEx::InternetCallbackFunc(....){ ................ static nRequestCompleteID = 0; // Act on status code. switch(dwInternetStatus) { case INTERNET_STATUS_RESOLVING_NAME: // Use pStr to point to the value. TRACE(">>>>>>> INTERNET_STATUS_RESOLVING_NAME.\n"); break; .................... // nRequestCompleteID 会改变 }}在这个类的成员函数WaitForGrabFinished():int CWebGrabEx::WaitForGrabFinished(){ while(g_nRequestCompleteID != -1 && g_nRequestCompleteID != -2 && ( (m_nNowTime = GetTickCount()) - m_nOldTime < m_nTimeOut*1000) ) { Sleep(200); } ................}我在回调里面要使用一个nRequestCompleteID记录当然回调执行的状态,但是这个值在这个类里面也要使用,我应该怎么定义?我现在用一个全局变量g_nRequestCompleteID来实现共享,但是这样如果我创建几个同样类的话,就会乱套了。有没有好的解决办法?我也可以创建一个类似MAP的数组记录nRequestCompleteID,让100个线程的记录值互不影响,但是这样做不是最好的办法。 把nRequestCompleteID的指针作为回调函数的参数传递进去不就行了? 回调是m_hSession自己调用的,你不会是说自己定义一个消息,直接调用回调函数吧。好像可以哦 是这样吗? void CALLBACK InternetStatusCallback( HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength);里面的dwContext就可以用啊 我还是放到LPVOID lpvStatusInformation里吧,INTERNET_ASYNC_RESULT iar;iar.dwResult = (DWORD)&m_nRequestCompleteID;iar.dwError = 0;InternetCallbackFunc( m_hSession, (DWORD)this, INTERNET_STATUS_TRANS_REQUESTCOMPLETEID, (LPVOID)&iar, sizeof(INTERNET_ASYNC_RESULT) ); 请教 用VC++6.0怎么样可以实现用设定好的时间分别依次取三组数据 什么时候用datagrid,什么时候不用呢? VC++操作EXCEL的问题 CDgridctrl网格编程,可以不提供数据源吗 在WIN2000下建立共享目录的问题 求助! 我想把*.mpv格式文件转换为*.avi,请问大侠要不要了解文件的压缩格式? 关于BUTTON的一个简单问题 问一下应该怎么学COM,我觉得好难学哦,有COM高手吗?指点迷精 寻找帮助文件,不用msdn 在软件中提供对外的COM接口的问题 ActiveX控件的两个小问题
但是遇到一个问题,我很菜,找不到好的解决的方法。请大家指教
指教。我写了一个CWebGrabEx类,没有用MFC,在初始化时有m_pOldCallback = ::InternetSetStatusCallback(
m_hSession,
(INTERNET_STATUS_CALLBACK) InternetCallbackFunc
);
在回调函数:
void CALLBACK CWebGrabEx::InternetCallbackFunc(....)
{
................
static nRequestCompleteID = 0; // Act on status code.
switch(dwInternetStatus)
{
case INTERNET_STATUS_RESOLVING_NAME:
// Use pStr to point to the value.
TRACE(">>>>>>> INTERNET_STATUS_RESOLVING_NAME.\n");
break;
....................
// nRequestCompleteID 会改变
}
}在这个类的成员函数WaitForGrabFinished():int CWebGrabEx::WaitForGrabFinished()
{
while(g_nRequestCompleteID != -1
&& g_nRequestCompleteID != -2
&& ( (m_nNowTime = GetTickCount()) - m_nOldTime < m_nTimeOut*1000)
)
{
Sleep(200);
}
................
}我在回调里面要使用一个nRequestCompleteID记录当然回调执行的状态,
但是这个值在这个类里面也要使用,我应该怎么定义?我现在用一个全局变量g_nRequestCompleteID来实现共享,但是这样如果我
创建几个同样类的话,就会乱套了。有没有好的解决办法?我也可以创建一个
类似MAP的数组记录nRequestCompleteID,让100个线程的记录值互不影响,
但是这样做不是最好的办法。
HINTERNET hInternet,
DWORD_PTR dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength
);里面的dwContext就可以用啊
LPVOID lpvStatusInformation里吧,INTERNET_ASYNC_RESULT iar;
iar.dwResult = (DWORD)&m_nRequestCompleteID;
iar.dwError = 0;
InternetCallbackFunc(
m_hSession,
(DWORD)this,
INTERNET_STATUS_TRANS_REQUESTCOMPLETEID,
(LPVOID)&iar,
sizeof(INTERNET_ASYNC_RESULT)
);