多线程编程(3)--从CreateThread说起(倒数第二个参数)

转载自:万一的博客

function CreateThread(
  lpThreadAttributes: Pointer;
  dwStackSize: DWORD;
  lpStartAddress: TFNThreadStartRoutine;
  lpParameter: Pointer;
  dwCreationFlags: DWORD; {启动选项}
  var lpThreadId: DWORD
): THandle; stdcall;

  



  CreateThread的倒数第二个参数dwCreateFlasg(启动选项)有两个可选值

0:线程建立后立即执行入口函数

CREATE_SUSPENDED:线程建立后会挂起等待

  可以ResumeThread 函数恢复线程的运行;可用 SuspendThread再次挂起线程。这两个函数的参数都是线程句柄,返回值都是执行前的挂起计数

  什么是挂起计数?

  SuspendThread会个这个数+1, ResumeThread会给这个数-1;但是这个数最小是0。如果这个数是0,线程会运行; >0 时会挂起。所以如果被SuspendThread 多次,同样需要ResumeThread 多次才能恢复线程的运行

  



  下面的例子中,有新线程不断给一个全局变量赋随机值

  同时窗体上的Timer 控件每隔 1/10秒就把这个变量写在窗体标题

  在这个过程中演示了ResumeThread 和SuspendThread这两个函数,运行效果图如下

  代码如下

unit Unit1;

interface
uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
    TForm1=class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Timer1: TTimer;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
    end;

var
    Form1: TForm1;

implementation
{$R *.dfm}

var
    hThread: THandle;    //线程句柄
    num: Integer;        //全局变量,用于记录随机数

{线程入口函数}
function MyThreadFun(p: Pointer): Integer; stdcall;
begin
    while True do
    begin
        num:= Random(100);
    end;
    Result:= 0;
end;

{建立并挂起线程}
procedure TForm1.Button1Click(Sender: TObject);
var
    ID: DWORD;
begin
    hThread:= CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
    Button1.Enabled:= False;
end;

{唤醒并继续线程}
procedure TForm1.Button2Click(Sender: TObject);
begin
    ResumeThread(hThread);
end;

{挂起线程}
procedure TForm1.Button3Click(Sender: TObject);
begin
    SuspendThread(hThread);
end;

{下面是窗体代码}
procedure TForm1.FormCreate(Sender: TObject);
begin
    Timer1.Interval:= 100;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Text:= IntToStr(num);
end;

end.

  

  下面是窗体文件

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = ‘Form1‘
  ClientHeight = 86
  ClientWidth = 269
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = ‘Tahoma‘
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 16
    Top = 24
    Width = 75
    Height = 25
    Caption = ‘Button1‘
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 97
    Top = 24
    Width = 75
    Height = 25
    Caption = ‘Button2‘
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 178
    Top = 24
    Width = 75
    Height = 25
    Caption = ‘Button3‘
    TabOrder = 2
    OnClick = Button3Click
  end
  object Timer1: TTimer
    OnTimer = Timer1Timer
  end
end

  



  ResumeThread 和SuspendThread 分别对应 TThread的Resume 和 Suspend 方法,很好理解

  接下来应该是 CreateThread的第四个参数了(也就是倒数第三个参数)

时间: 2024-10-02 01:08:28

多线程编程(3)--从CreateThread说起(倒数第二个参数)的相关文章

多线程编程(4)--从CreateThread说起(倒数第三个参数)

转载自:万一的博客 function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; {入口函数的参数} dwCreationFlags: DWORD; var lpThreadId; DWORD; ): THandle; stdcall; 线程入口函数的参数是一个无类型指针(Pointer),用它

多线程编程(2)--从CreateThread说起

转载自:万一的博客 function CreateThread( lpThreadAttributes: Pointer; //安全设置 dwStackSize: DWORD; //堆栈大小 lpStartAddress: TFNThreadStartRoutine; //入口函数 lpParameter: Pointer; //函数参数 dwCreationFlags: DWORD; //启动选项 var lpThreadId: DWORD; //输出线程ID ): THandle; stdc

delphi之多线程编程(尚未学习)

本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1. 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个:  procedure TForm1.Button1Click(Sender: TObject); var   i: Integer; begin 

delphi 多线程编程

开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握

多线程编程1

参考资料: http://blog.csdn.net/JXH_123/article/details/23450031                             秒杀多线程系列 http://www.baidu.com/index.php?tn=utf8kb_oem_dg&addresssearch=1#wd=C%2B%2B%E5%BE%AA%E7%8E%AF%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97&ie=utf-8&tn=utf8kb

C++多线程编程入门之经典实例

多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制,但Windows系统为我们提供了相关API,我们可以使用它们来进行多线程编程.本文就以实例的形式讲解多线程编程的知识. 创建线程的API函数 C++代码 HANDLE CreateThread( __in   SEC_ATTRS SecurityAttributes, __in   ULONG StackSize,  

Windows下多线程编程(一)

前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. 进程与线程 1. 进程的概念 进程就是正在运行的程序.主要包括两部分: • 一个是操作系统用来管理进程的内核对象.内核对象也是系统用来存放关于进程的统计信息的地方. • 另一个是地址空间,它包含所有可执行模块或 D L L模块的代码和数据.它还包含动态内 2. 线程的概念 线程就是描述进程的一条执

秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别

版权声明:本文为博主原创文章,未经博主允许不得转载. 本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex? 使用多线程其实是非常容易的,下面这个程序的主线程会创建了一个子线程并等待其运行完毕,子线程就输出它的线程ID号然后输出一句经