zoukankan      html  css  js  c++  java
  • 多线程【Delphi版】

    一.基本注意点

              1.访问公共变量时需要设置临界区

              2.不可直接操作界面,需通过向窗口发送消息来处理

               PS:下面的测试程序中,为简单起见,在线程中直接对主界面进行了操作,实际开发

             项目时是不应该如此操作的。

     

    二.主要代码

         公共变量与临界区变量

    unit GlobalVar;
    
    interface
    uses
      Windows;
    
    var
      userCount:Integer;
      UserInfoRTL:TRTLCriticalSection;
    
    implementation
    
    end.

         线程定义

    unit UserInfoManage_Thread;
    
    interface
    
    uses
      Classes, SysUtils, GlobalVar,Windows;
    
    type
        TUserInfoManage_Thread= class(TThread)
        private
    
        public
          constructor Create(CreateSuspended: Boolean);
          procedure  Execute;override;
          destructor Destroy;override;
      end;
    
    implementation
    uses
      Main;
    { TUserInfoManage_Thread }
    
    constructor TUserInfoManage_Thread.Create(CreateSuspended: Boolean);
    begin
       inherited Create(CreateSuspended);
    end;
    
    destructor TUserInfoManage_Thread.Destroy;
    begin
    
      inherited;
    end;
    
    procedure TUserInfoManage_Thread.Execute;
    var
      printStr:string;
    begin
      inherited;
    
      EnterCriticalSection(UserInfoRTL);//进入临界区
      try
        userCount:=userCount+1;
    
        printStr:=''+inttostr(userCount)+'个线程已启动,并进入临界区';
        FrmMain.Memo1.Lines.Add(printStr);
    
        printStr:='休眠2000毫秒。。。';
        FrmMain.Memo1.Lines.Add(printStr);
        Sleep(2000);
    
        printStr:=''+inttostr(userCount)+'个线程执行完毕,离开临界区';
        FrmMain.Memo1.Lines.Add(printStr+#13#10);
      finally
        LeaveCriticalSection(UserInfoRTL);//离开临界区
      end;
    
      Self.FreeOnTerminate:=True;
    end;
    
    end.

          主程序初始化“临界区变量”

       userCount:=0;
       InitializeCriticalSection(UserInfoRTL);

          连续启动多个线程

    begin
      TUserInfoManage_Thread.Create(False);
    
      TUserInfoManage_Thread.Create(False);
    
      TUserInfoManage_Thread.Create(False);
    end;

    三.运行结果

       

  • 相关阅读:
    arduino链接GY521(MPU6050)模块
    I2C Python Library ITG3205 API
    [翻译]AxureInteractive Prototypes原型设计工具Axure学习第2.3节
    [Java]XML数据的请求和DOM技术解析
    [Linux]VI相关操作
    mysql数据库连接错误问题
    关于管理单元初始化失败的解决方法
    彻底明白Java的IO系统(网上找的,还没看,先放这)
    一个关于C++ Inline关键字的引发的一个错误
    orcale 中日期类型相加的处理
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2515030.html
Copyright © 2011-2022 走看看