• delphi.thread.线程循环执行体结构


    线程话题太大,又都是些坑,不知从哪方面讲起,所以,想一出是一出了。 

      不管怎样,我们从开始使用D,不管有没有用线程,其实它已经帮我们做了一个最完整的线程执行处理:Application.Run.

      这行App.Run,在dpr,想来各位都经常能够看到,如果跟踪下去,我们就会发现,它其实就是一个最完整的线程执行体的结构了:

     我将里面一些代码删除掉了,再将HandleMessage的代码复制过来,然后,代码如下:
    procedure TApplication.Run;
    var
      Msg: TMsg;
    begin 
      repeat
        try
          if not ProcessMessage(Msg) then Idle(Msg);
        except
          HandleException(Self);
        end;
      until Terminated;
    end;

      好了,我们不用去看里面代码意思,因为从代码意思来讲,它思路很简单,而且此文,也不是要去分析介绍App的代码。

      这个Run,其实给我们介绍了一个线程执行体的大体结构思路,我觉得有意思的就是这循环体结构了。

      上述的APP循环执行体,大体思路是:

        1: 调用消息处理();

        2: 没消息,就做空闲处理();

        3: 不中断程序就继续循环。

      这循环结构,我觉得与线程操作大体思路是相符的。那么,它也是可以看成是线程循环执行结构了:

    procedure TMyThread.Execute();
    begin 
      repeat
        try
          if not DoThreadJob() and not DoThreadIdle() then
             Sleep(10);
        except
          on E: Exception do
            DoHandleException(E);
        end;
      until Terminated;
    end;

      当然,未有作业时,Sleep进行阻塞及切换线程时,可以弄个计数,累计idle的次数,到了一定次数后,再进行sleep,计数再复位。

      如下示例:

    procedure TMyThread.Execute();
    const
      // 根据线程服务性质,进行设定,或进行外部配置
      // MAX_IDLE值越大,表示该线程的处理需要越多时间(切换次数越少),
      // MAX_IDLE值越小,线程切换次数越多。
      MAX_IDLE = 32;
    var
      idle_count: Integer;
    begin
      idle_count := 0;
      repeat
        try
          if not DoThreadJob() then
          begin
            if not DoThreadIdle() then
              Inc(idle_count)
            else
              idle_count := 0;
          end else
            idle_count := 0;
    
          if idle_count >= MAX_IDLE then
          begin
            idle_count := 0;
            Sleep(10);
          end;
        except
          on E: Exception do
            DoHandleException(E);
        end;
      until Terminated;
    end;

      然后,线程在未有作业处理时,去做空闲处理,空闲处理也未有时,再sleep,我觉得这思路,在写长期运行的逻辑服务处理是很好的适用思路。

      且很多处理,是可以放置于ThreadIdle进行外部处理,再扩展,如同Application.Idle,运行频率是非常高。。。

      好像要写的东西,就这么些。。。

      

     水平有限,如有雷同,就是盗链,:D

    2014.11.02 by qsl

  • 相关阅读:
    朴素贝叶斯分类及应用
    【会员动态】2015ADM | 王牌先生,带你体验当代绅士的生活美学-浙江省创意设计协会-微头条(wtoutiao.com)
    【独家】专注男士着装搭配服务,王牌先生获华旦领投近500万天使融资 | 猎云网
    原木色衣架色系【价格 批发 品牌 网上进货】-阿里巴巴旺铺
    阿里管理三板斧:揪头发、照镜子、闻味道-天下网商
    阿里巴巴管理三板斧
    ISC 2016
    港澳通行证签注可以自助办理了 三分钟搞定
    中国“四大”名绣之苏绣_张家睿_新浪博客
    CoolCTO
  • 原文地址:https://www.cnblogs.com/qiusl/p/4069333.html
Copyright © 2020-2023  润新知