• 注册
  • 关于作者
    企业认证:趣记站长
    关注 6 粉丝 4 喜欢 9 内容 992
    江西省·赣州市
    聊天 送礼
    • 查看作者
    • 用Delphi编程时如何运用线程

      重 庆 邮 电 学 院 计 算 机 系 综 合 微 机 室

      马 英 杰

      ---- Windows 95 是Microsoft 公 司 的 第 一 个 真

      正 的 多 任 务 操 作 系 统。 在 每 一 时 刻 可 以

      有 多 个 进 程 同 时 工 作, 而 每 一 个 进 程 又 包 含 有 多 个 线

      程。 但 只 有 一 个 处 理

      器 的 计 算 机 不 可 能 真 正 地“ 同 时” 执 行 多 个 线 程, 而

      是 操 作 系 统 把 时 间 分 成

      若 干 个 时 间 片, 然 后 把 一 个 个 时 间 片 分 配 给 每 一 个 线

      程。

      ---- 一 个 执 行 了 的 程 序 就 是 一 个 进

      程, 一 个 进 程 则 至 少 有 一 个 主 线 程。 一 位

      高 级 程 序 员, 绝 不 会 让 自 己 的 程 序 里 面 只 有 一 个 主 线

      程 存 在( 除 非 只 有 很

      少 的 几 十 行 代 码), 而 是 尽 量 让 自 己 的 程 序 在 同 一 时

      刻 里 干 更 多 的 事, 在

      比 较 大 一 点 的 应 用 中 尤 其 如 此, 象 数 据 库 应 用 程 序,

      在 统 计 的 时 候 我 还 想

      做 其 他 事 呢 ! 因 此, 如 何 有 效 地 利 用 线 程 则 是 每 一 个

      程 序 员 都 应 了 解 的。

      本 文 就 此 简 单 地 谈 一 下 在Delphi 中 如 何 利 用 线 程。

      ---- ( 一) 当 使 用 线 程 时, 我 们 主 要 有

      两 个 任 务:

      ---- (1) 创 建 一 个 线 程。

      ---- (2) 创 建 一 个 能 作 为 线 程 入 口

      的 函 数。

      ---- Windows API 调 用CreateThread 函 数 来 创 建

      一 个 线 程。 函 数 如 下:

      HANDLE CreateThread(LPSECURITY_

      ATTRIBUTES  lpThreadAttributes,

      //线程安然属性所在

        DWORD  dwStackSize,

        //初始化线程堆栈尺寸

        LPTHREAD_START_ROUTINE  lpStartAddress,

        //线程函数所指向的所在

           LPVOID  lpParameter,

        //给线程函数转达的参数

        DWORD  dwCreationFlags,

        //有关线程的符号

        LPDWORD  lpThreadId

        //系统分配给线程的ID

           );

      ---- 第 一 个 参 数 是 安 全 属 性, 一 般

      设 为nil, 使 用 缺 省 的 安 全 属 性。 当 我 们 想 此

      线 程 有 另 外 的 子 进 程 时, 可 改 变 它 的 属 性。

      ---- 第 二 个 参 数 是 线 程 堆 栈 尺 寸,

      一 般 设 为0, 表 示 与 此 应 用 的 堆 栈 尺 寸 相

      同, 即 主 线 程 与 创 建 的 线 程 一 样 长 度 的 堆 栈。 并 且 其

      长 度 会 根 据 需 要 自 动

      变 长。

      ---- 第 三 个 参 数, 也 是 最 重 要 的 一

      个, 是 一 个 指 向 函 数 名 的 指 针,

      自动运行的MS-OFFICE应用程序
      VC++中利用/GS开关防止缓冲区溢出,VC实现系统热键激活后台服务程序,用Visual C++干干净净地清除进程,用Visual C++设计屏幕抓图程序,在VC中为应用程序添加图形超链接功能,详解Visual C++ 2005中的突破性变化,用VC++制作播放AVI视频流的动画按钮,在程序的状态栏中实现进度条,利用Visual C++设计自己的资源浏览器,VC++动态链接库编程之DLL木马,VC++编程实现对火焰的计算机动态仿真,VC中利用多线程技术实现线程之间的通信,利用OpenGL实现三维绘图,基于Visual C++的Winsock API研究,基于Visual C++6.0的DLL编程实现,Visual C++ MFC 中常用宏的含义,在MFC下如何定义全局变量和全局函数,使用MFC在应用程序中嵌入MS Word,VC++中进程与多进程管理的方法,Visual C++6.0 API函数操作技巧集
      Visual C++

      但 传 递 时

      很 简 单, 只 需 在 线 程 函 数 名 前 加 上@ 就 可 以 了。

      ---- 第 四 个 参 数 是 你 需 要 向 线 程 函

      数 传 递 的 参 数, 一 般 是 一 个 指 向 结 构 的 指

      针。 不 需 传 递 参 数 时, 则 这 个 参 数 设 为nil。

      ---- 第 五 个 参 数, 传 入 与 线 程 有 关

      的 一 些 标 志, 如 果 是CREATE_SUSPENDED, 则 创 建

      一 个 挂 起 的 线 程, 即 这 个 线 程 本 身 已 创 建, 它 的 堆 栈

      也 已 创 建。 但 这 个 线

      程 不 会 被 分 配 给CPU 时 间, 只 有 当ResumeThread 函 数 被 调 用 后

      才 能 执 行; 当 然,

      也 可 以 调 用SuspendThread 函 数 再 次 挂 起 线 程。 要 是 标 志 为0,

      那 么 一 旦 建 立 线

      程, 线 程 函 数 就 被 立 即 调 用。 一 般 传 为0 即 可。

      ---- 最 后 一 个 参 数 是 系 统 分 配 给 这

      个 线 程 的 唯 一 的ID 标 志。

      ---- 下 面 这 个 程 序MyThreadPro.pas 介 绍 了

      线 程 如 何 建 立 及 使 用:

      //Your first test Thread Program.

      unit MyThreadPro;

      interface

      uses

        Windows, Messages, SysUtils, Classes,

      Graphics, Controls, Forms, Dialogs,

        StdCtrls;

      type

        TForm1 = class(TForm)

          UsedThread: TButton;

          NoUsedThread: TButton;

          procedure UsedThreadClick(Sender: TObject);

          procedure NoUsedThreadClick(Sender: TObject);

      var

        Form1: TForm1;

      implementation

      {$R *.DFM}

      //这是线程函数,

      它可以或许放在下面递次的任何地方

      function MyThreadFunc(P:pointer):Longint;stdcall;

      var

         i:integer;

         DC:HDC;

         S:string;

      begin

           DC:=GetDC(Form1.Handle);

           for i:=0 to 100000 do begin

               S:=Inttostr(i);

               Textout(DC,10,10,Pchar(S),length(S));

           end;

           ReleaseDC(Form1.Handle,DC);

      end;

      procedure TForm1.UsedThreadClick(Sender: TObject);

      var

         hThread:Thandle;//定义一个句柄

         ThreadID:DWord;

      begin

      //竖立线程,同时线程函数被调用

      hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);

           if hThread=0 then

      messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);

      end;

      procedure TForm1.NoUsedThreadClick(Sender: TObject);

      begin

           MyThreadfunc(nil);

      //没有竖立线程时,直接调用线程函数

      end;

      end.

      ---- 上 面 这 个 程 序 介 绍 了 我 们 在 使

      用 线 程 及 未 使 用 线 程 二 种 情 况 下, 运 行 该

      程 序 的 反 应。 当 点UsedThread 按 钮 时, 则 建 立 一 个 线 程, 这

      时 我 们 可 以 在 程 序

      进 行 计 算 的 同 时, 改 变 窗 体 的 尺 寸 及 移 动 它。 当 按 下NoUsedThread

      按 钮 时, 不

      建 立 线 程, 我 们 会 发 现 在 程 序 没 有 计 算 完 之 前 根 本 不

      能 做 其 它 任 何 事 情 !

      此 程 序 在 基 于Windows 95 的Delphi 3 中 运 行 通 过。

      自动运行的MS-OFFICE应用程序
      VC++中利用/GS开关防止缓冲区溢出,VC实现系统热键激活后台服务程序,用Visual C++干干净净地清除进程,用Visual C++设计屏幕抓图程序,在VC中为应用程序添加图形超链接功能,详解Visual C++ 2005中的突破性变化,用VC++制作播放AVI视频流的动画按钮,在程序的状态栏中实现进度条,利用Visual C++设计自己的资源浏览器,VC++动态链接库编程之DLL木马,VC++编程实现对火焰的计算机动态仿真,VC中利用多线程技术实现线程之间的通信,利用OpenGL实现三维绘图,基于Visual C++的Winsock API研究,基于Visual C++6.0的DLL编程实现,Visual C++ MFC 中常用宏的含义,在MFC下如何定义全局变量和全局函数,使用MFC在应用程序中嵌入MS Word,VC++中进程与多进程管理的方法,Visual C++6.0 API函数操作技巧集
      Visual C++

    • 0
    • 0
    • 0
    • 80
    • 单栏布局 侧栏位置: