码迷,mamicode.com
首页 > 编程语言 > 详细

delphi的多线程实现和线程与进程的关系说明

时间:2015-04-05 14:42:14      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:多线程   delphi   

做了个多线程的测试Demo   
    unit Unit1;

interface

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

type
  TForm1 = class(TForm)
lbl1: TLabel;
btn1: TButton;
btn2: TButton;
btn3: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
  private
{ Private declarations }
 th: TMyTestThread;
  public
{ Public declarations }
  end;

var
  Form1: TForm1;

implementation
//uses
//Unit2;
{$R *.dfm}



procedure TForm1.btn1Click(Sender: TObject);
begin
//False是创建一个可执行的 线程,True是创建一个挂起的线程
  th := TMyTestThread.Create(False);

end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  PostThreadMessage(th.ThreadID, PWM_COMMWRITE, 0, 0);
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  PostThreadMessage(th.ThreadID, PWM_TEST1, 0, 0);
end;

end.
//===================第二个单元代码==========================
unit Unit2;

interface

uses
  Classes,Windows, Messages, SysUtils;
const
//自定义消息只能比WM_USWER大,如果小就是系统消息了
  PWM_COMMWRITE = WM_USER+1;
  PWM_TEST1 = WM_USER + 2;

type
  TMyTestThread = class(TThread)
  private
{ Private declarations }
counter : integer;
  protected
procedure Execute; override;
procedure UpdateUI();
  end;

implementation

uses Unit1;

{ TMyTestThread }
procedure TMyTestThread.UpdateUI();
begin
  Form1.lbl1.Caption := ‘Updated‘ + IntToStr(counter);
end;
procedure TMyTestThread.Execute;
var
  i : integer;
  msg:   TMsg;
begin
  { Place thread code here }
  while True do
  begin
if GetMessage( msg, 0, 0, 0) = False then
begin
  break;
end;

if msg.hwnd <> 0{NULL} then
begin
  TranslateMessage(msg);
  DispatchMessage(msg);
  Continue;
end;

// Handle the message.
case msg.message of
  PWM_COMMWRITE:  // New string to write to Comm port.
  begin
    for i := 0 to 10 do
    begin
      Sleep(100);
    end;
  end;

  PWM_TEST1:
  begin
    counter := counter + 1;
    Synchronize(UpdateUI);
  end;
end;
  end;
end;

end.

线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
4)二者均可并发执行.

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

delphi的多线程实现和线程与进程的关系说明

标签:多线程   delphi   

原文地址:http://blog.csdn.net/singular2611/article/details/44886639

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!