我在一个网页中,用循环提取了10个链接,然后翻页,再提取十个链接,因为耗时很长,为了能随时终止程序,就创建一个子线程来挨个处理提取到的这十个链接,问题是当子线程处理链接的时候,那么主线程还会继续进行啊,万一子线程没处理完那个链接,这个主线程还会创建子线程处理链接吧,问题是我用同一个对象在子线程中处理提取的链接。
我不知道这样实现行不行,也许我思路有点混乱,大家给点意见吧。我该怎么实现呢?

解决方案 »

  1.   

    主线程创建子线程之后,挂起自己,知道子线程运行结束,msdn里有最简单不过的例子:
    int main()

        HANDLE hThread;
        unsigned threadID;    printf( "Creating second thread...\n" );    // Create the second thread.
        hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );    // Wait until second thread terminates. If you comment out the line
        // below, Counter will not be correct because the thread has not
        // terminated, and Counter most likely has not been incremented to
        // 1000000 yet.
        WaitForSingleObject( hThread, INFINITE );
        printf( "Counter should be 1000000; it is-> %d\n", Counter );
        // Destroy the thread object.
        CloseHandle( hThread );
    }
      

  2.   

    WaitForSingleObject( hThread, INFINITE );
    我发现我们的类中有个表示线程句柄的成员变量
    WaitForSingleObject(m_net.m_hThread,INFINITE);
    可是编译后,错误error C2664: 'WaitForSingleObject' : cannot convert parameter 1 from 'unsigned long' to 'void *'
      

  3.   

    WaitForSingleObject((HANDLE)m_net.m_hThread,INFINITE); 
    我修改了一下,发现这样好了,我先留着,估计带回还会有问题,到时再请教大家吧
      

  4.   

    嗯嗯,就是强制转换下,不过你得确认下,m_hThread是线程ID还是handle,这个函数要求的是handle
      

  5.   

    还有个问题是我用WaitForSingleObject((HANDLE)m_net.m_hThread,INFINITE); 在子线程运行期间,主线程就不能处理按钮消息了,而我的目的是要它仍然能处理按钮等CMainFrame消息处理啊,这个改怎么改呢?
      

  6.   

    那就改成一种类似定时检测信号的机制,比如
    WaitForSingleObject((HANDLE)m_net.m_hThread,INFINITE);
    改成
    WaitForSingleObject((HANDLE)m_net.m_hThread,200); //等待200毫秒
    每次等待200毫秒之后,
    如果time out,则表明线程还在执行;
    其他表示线程结束了或者一些错误,请参考msdn然后想个办法定期执行WaitForSingleObject
     
      

  7.   

    非常感谢你,现在问题是我的主线程是在个循环里调用一个子线程的,而且,还要用个timer时钟,检测当子线程满足一个条件后执行一个函数,当函数执行完毕后,主框架的GRid会显示一个结果,然后。主线程应该进行第二次循环了,然后再子线程,可是,在第一次循环后好像就什么都终止了,这该如何实现呢?
      

  8.   


    主要就是提取超链接,和处理超链接的问题开三个线程
    1主线程 显示状态,接受停止命令等
    2子线程 获取链接,保存到CStringList ,翻页,提取... ...3子线程 获取CStringList 的 第一项url,处理,处理完,删除第一项, 继续获取... ...建议一个线程一个类