遇到一个问题不知道该怎么解决了,大家帮帮忙吧,多谢了。
首先,创建一个SOCKET是不是系统就为你创建了对应的一个线程;
然后,有一个具体的问题。
我写了这样的一个函数:
QueryRemoteData(CString& strData, const CList<REMOTE_ADDR, REMOTE_ADDR>& lstRemote)
根据CList中保存的远程机器的地址和端口,建立SOCKET分别与其连接;获取所需的数据后用strData返回。
问题是:我不知道我所发出的SOCKET请求是否得到回应,如果得到回应,要多长时间;所以我必须在这个函数中等待一定的时间,时间到了以后,更新strData,返回;我觉得一个SOCKET对应一个线程,也就是说我已经创建了其他的一些线程,于是我试图阻塞当前线程,也就是该函数,使用的是WaitForSingleObject,等待时间设为5秒,但我好像想错了,该函数被阻塞,但其他的线程也无法正常运行,是不是对应SOCKET的不是线程?我应该怎么解决这个问题?我希望尽量不要改变函数的形式,因为这样一来就要做很大的改动。大家有没有遇到过这种情况,帮帮忙啊。万分感谢!

解决方案 »

  1.   

    函数体如下:
    for (POSITION pos = lstRemote.GetHeadPosition(); pos != NULL;) {
    REMOTE_ADDR addr = lstRemote.GetNext(pos); THRDPARAM ThrdParam;
    ThrdParam.addr = addr;
    ThrdParam.pTSAgent = this; AfxBeginThread(ReqThread, &ThrdParam, THREAD_PRIORITY_NORMAL);
    } // 等待TIME_TO_WAIT的时间,放弃没有收到回应的SOCKET
    while (true) {
    CEvent event;
    ::WaitForSingleObject(event.m_hObject, TIME_TO_WAIT);
    break;
    } strData = REMOTE_HOST;
    strData += m_strRemoteData; // 删除等待SOCKET队列
    for (POSITION posSocket = g_pSocketList.GetHeadPosition(); posSocket != NULL;) {
    CReqSocket* pToDel = (CReqSocket*)g_pSocketList.GetNext(posSocket);
    pToDel->Close();
    delete pToDel;
    }
    g_pSocketList.RemoveAll();