线程通信初探[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 panda_w 的 blog

    进程是运行中的程序,有独立的内存,文件句柄和其它的系统资源,一个独立的进程可以包含多条执行路径,即线程。一个函数可以被多个线程访问,多个线程可以访问同一个全局变量。
    windows提供两种线程,用户界面线程和辅助线程。用户界面线程有窗口,因此有自己的消息循环,辅助线程没有窗口,不需要处理消息。但是辅助线程非常有用而且很容易编程,比如程序在某个运行时间要完成多个(很笨重的)任务时,显然,辅助线程的使用会使程序的运行效率大大的提高。但是,线程间的通信是一个必须解决的问题。
    下面我们就来讨论一下线程间的通信的问题:
   一.线程的管理
     1.线程的启动:
       在使用辅助线程时,我们必须为线程写一个全局函数,它的返回值必须为   uint类型,而且必须有lpvoid类型的参数,启动线程调用下面的函数:
    cwinthread* pthread=afxbeginthread(
                        afx_threadppoc threadproc,
                        lpvoid pparam,
                        int npriority,
                        uint nstacksize,
                        dword dwcreateflags,
                        lpsecurity_attributes lpsecurityattrs);
    全局函数必须定义为 uint threadproc(lpvoid pparam);
    afxbeginthread会立即返回一个指向新创建的线程对象的指针,用来管理线  程,包括挂起和恢复线程的运行,但是线程对象没有成员函数来中止线程的运  行。afxbeginthread的第二个参数是一个32位的值,用来传给全局函数;第三  个参数用来设定线程的优先级;而第四和第六个参数用来指定线程堆栈大小和  安全性,一般采用默认值0;第五个参数用来设定创建线程对象的方式,0为立  即执行,create_suspend为线程通过resumethread后才执行。
    而线程优先级的设置和获得可以通过下面的两个函数来实现:
    pthread->setthreadpriority(thread_priority_above_nomal);和
    int npriority=pthread->getthreadpriority();
    2.线程的中止:
      可以调用mfc的afxendthread函数;
    3.检查线程是否结束:
      调用api函数getexitcodethread,
           dword exitcode ;
           ::getexitcodethread(pthread->m_hthread,&exitcode );
           if(exitcode==still_active)
               //运行中
           else   //线程已经中止
    二.主线程和辅助线程的通信
      主线程和辅助线程间的通信方式有很多种,最简单的就是利用全局变量。    这里利用消息通信是行不通的,因为辅助线程没有消息循环,不能够利用       windows消息。
      下面我们用一个例子来说明。在例子中,我们写一个非常笨的函数,如实  现500*3000*3000的加法数据处理函数add(int ncount);
  我们在对话框上放置start、cancel按钮和一个用来表示数据处理进度的进度条  。
    1.利用全局变量来实现主线程和辅助线程的通信:
     我们编写全局函数如下:
          uint threadproc(lpvoid pparam)
          {
              ncount=0;//全局变量
              while(ncount<500)
              {
                 add(ncount);
                 ::interlockedincrement((long*)&ncount);
               }
               return 0;
          }
      函数interlockincrement阻塞其它的线程,当计数器递增时防止其它的线程访问ncount。
     2.利用消息实现辅助线程和主线程的通信:
      主线程有一个窗口,有消息循环,我们可以在调用afxbeginthread时把窗口句柄传递给辅助线程,我们通过post方式传递消息,在函数退出时,给窗口发送一个消息。
        重新编写线程函数如下:
          int ncount=0;
          uint threadproc(lpvoid pparam)
          {
           while(ncount<500)
           {
            ::interlockedincrement((long*)&ncount);

本文关键:线程通信初探
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top