csdn老师vagrantisme 说后台运行就是让一个线程跑而已 由于还没学到线程 接触了一个afxbegin线程函数 是不是让线程跑就是afxbegin(function ,this)就是让程序在后台运行了 请给个能用的小例子解释一下 谢谢

解决方案 »

  1.   

    这个后台是感官意义上的,你的意思貌似就是工作者线程线程分用户界面线程和工作者线程两种。用户界面线程拥有自己的消息泵来处理界面消息,可以与用户进行交互。工作者线程没有消息泵,一般用来完成后台工作。  MFC应用程序的线程由对象CWinThread表示。在多数情况下,程序不需要自己创建CWinThread对象。调用AfxBeginThread函数时会自动创建一个CWinThread对象。  例如,清单12.2中的代码演示了工作者线程的创建。AfxBeginThread函数负责创建新线程,它的第一个参数是代表线程的函数的地址,在本例中是MyThreadProc。第二个参数是传递给线程函数的参数,这里假定线程要用到CMyObject对象,所以把pNewObject指针传给了新线程。线程函数MyThreadProc用来执行线程,请注意该函数的声明。线程函数有一个32位的pParam参数可用来接收必要的参数。清单12.2 创建一个工作者线程//主线程pNewObject = new CMyObject;AfxBeginThread(MyThreadProc, pNewObject); //新线程UINT MyThreadProc( LPVOID pParam ){CMyObject* pObject = (CMyObject*)pParam; if (pObject == NULL ||!pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))return -1; // 非法参数 // 用pObject对象来完成某项工作 return 0; // 线程正常结束}  AfxBeginThread的声明为:CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );   参数pfnThreadProc是工作线程函数的地址。pParam是传递给线程函数的参数。nPriority是线程的优先级,一般是THREAD_PRIORITY_NORMAL,若为0,则使用创建线程的优先级。nStackSize说明了线程的堆栈尺寸,若为0则堆栈尺寸与创建线程相同。dwCreateFlags指定了线程的初始状态,如果为0,那么线程在创建后立即执行,如果为CREATE_SUSPENDED,则线程在创建后就被挂起。参数lpSecurityAttrs用来说明保密属性,一般为0。函数返回新建的CWinThread对象的指针。  程序应该把AfxBeginThread返回的CWinThread指针保存起来,以便对创建的线程进行控制。例如,可以调用CWinThread::SetThreadPriority来设置线程的优先级,用CWinThread::SuspendThread来挂起线程。如果线程被挂起,那么直到调用CWinThread::ResumeThread后线程才开始运行。  如果要创建用户界面线程,那么必须从CWinThread派生一个新类。事实上,代表进程主线程的CWinApp类就是CWinThread的派生类。派生类必须用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏来声明和实现。需要重写派生类的InitInstance、ExitInstance、Run等函数。  可以使用AfxBeginThread函数的另一个版本来创建用户界面线程。函数的声明为:CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );  参数pThreadClass指向一个CRuntimeClass对象,该对象是用RUNTIME_CLASS宏从CWinThread的派生类创建的。其它参数以及函数的返回值与第一个版本的AfxBeginThread是一样的。  当发生下列事件之一时,线程被终止:线程调用ExitThread。线程函数返回,即线程隐含调用了ExitThread。ExitProcess被进程的任一线程显示或隐含调用。用线程的句柄调用TerminateThread。用进程句柄调用TerminateProcess。
      

  2.   


    Microsoft Windows NT 操作系统的最小运行单位就是线程。
    我们用 MFC 向导建立的程序,开始只有一个线程,我们叫它主线程。
    如果需要,我们可以再建立第二个线程,一般叫它为辅助线程。
    可以建立更多的线程。=======线程的运行是按时间片分配的,这个在学习『操作系统』时讲过了。单 CPU 中,操作系统为每个线程分配一定的时间片,这样感觉它们是在同时运行,其它某一时刻,只有一个线程在运行。=======举个例子,好理解一些:下面是一个大循环:
    for(i=0;i<1000000;i++)
    {
      ...
    }如果循环中的处理需要一定的时间的话,那么它会将界面变的假死,就是鼠标拖不动窗口了,按钮不起作用了。
    假如我们再建立一个线程,把这个复杂的计算放入这个辅助线程中处理的话,就不会出现假死的情况了,因为繁重的计算是在辅助线程中处理的。
      

  3.   

    谢谢老师的解答 这个问题回答与否 我都结贴 只是在线等待一会看是否还能回答 其实我的意思是 我已经有一个模拟点击某网页按钮的函数 但那个函数必须是打开对应网页的 我想利用线程函数使其不用真正的打开网页 而在后台自动完成 用afxbeginthread 可否达到这一效果 谢谢 只是在线等待一会看是否还能回答
      

  4.   


    你要是在后台读取网页,可以直接用 HTTP 协议读取,而且根本就不需要显示网页,读取后分析找到你要的元素就行。
    网页显示的步骤:1、指定 URL 路径;2、浏览器根据 URL 读取 HTML 文件到本地;3、分析 HTML 文件,显示出网页。
    如果你需要读取一些信息的话,只要执行上边的前2步,然后分析找到其中你要的即可,不需要显示网页。
    读取网页使用的是 HTTP 协议。