多线程编程(18)

前面的例子都是让若干线程做同样的事情, 下面这个例子中的三个线程将分别在三个画板上随机画不同颜色的椭圆.

接下来的很多事情我想要基于这个例子来做.

本例效果图:

代码文件:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
PaintBox2: TPaintBox;
PaintBox3: TPaintBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
h1,h2,h3: THandle;
{第一个线程的入口函数: 画红色椭圆}
function ThreadFun1(p: Pointer): Integer; stdcall;
var
i, x1,y1,x2,y2: Integer;
begin
Form1.PaintBox1.Canvas.Brush.Color := clRed;
for i := 0 to 50000 do with Form1.PaintBox1 do
begin
x1 := Random(Width); y1 := Random(Height);
x2 := Random(Width); y2 := Random(Height);
Canvas.Lock;
Canvas.Ellipse(x1,y1,x2,y2);
Canvas.Unlock;
Sleep(0);
end;
Result := 0;
end;
{第二个线程的入口函数: 画绿色椭圆}
function ThreadFun2(p: Pointer): Integer; stdcall;
var
i, x1,y1,x2,y2: Integer;
begin
Form1.PaintBox2.Canvas.Brush.Color := clGreen;
for i := 0 to 50000 do with Form1.PaintBox2 do
begin
x1 := Random(Width); y1 := Random(Height);
x2 := Random(Width); y2 := Random(Height);
Canvas.Lock;
Canvas.Ellipse(x1,y1,x2,y2);
Canvas.Unlock;
Sleep(0);
end;
Result := 0;
end;
{第三个线程的入口函数: 画蓝色椭圆}
function ThreadFun3(p: Pointer): Integer; stdcall;
var
i, x1,y1,x2,y2: Integer;
begin
Form1.PaintBox3.Canvas.Brush.Color := clBlue;
for i := 0 to 50000 do with Form1.PaintBox3 do
begin
x1 := Random(Width); y1 := Random(Height);
x2 := Random(Width); y2 := Random(Height);
Canvas.Lock;
Canvas.Ellipse(x1,y1,x2,y2);
Canvas.Unlock;
Sleep(0);
end;
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ID: DWORD;
begin
h1 := CreateThread(nil, 0, @ThreadFun1, nil, 0, ID);
h2 := CreateThread(nil, 0, @ThreadFun2, nil, 0, ID);
h3 := CreateThread(nil, 0, @ThreadFun3, nil, 0, ID);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(h1);
CloseHandle(h2);
CloseHandle(h3);
end;
end.

时间: 2024-12-21 21:07:12

多线程编程(18)的相关文章

PHP多线程编程之管道通信实例分析

 这篇文章主要介绍了PHP多线程编程之管道通信,实例分析了管道通信的原理与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP多线程编程之管道通信用法.分享给大家供大家参考.具体分析如下: 一个线程如果是个人英雄主义,那么多线程就是集体主义,你不再是一个独行侠,而是一个指挥家. 管道通信: 1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西.写就是 在队列末尾添加,读就是在队头删除. 2. 管道一般有大小,默认一般是4K,也就是内容

Ruby多线程编程初步入门

  这篇文章主要介绍了Ruby多线程编程初步入门,线程是Ruby编程学习当中的重点和难点,需要的朋友可以参考下 传统程序有一个单独的线程执行,包含该程序的语句或指令顺序执行直到程序终止. 一个多线程的程序有多个线程的执行.在每个线程是按顺序执行的,但是在多核CPU机器上线程可能并行地执行.例如,通常情况下在单一CPU的机器,多个线程实际上不是并行执行的,而是模拟并行交叉的线程的执行. Ruby的可以使用 Thread 类很容易地编写多线程程序. Ruby线程是一个轻量级的和高效的在代码中实现并行

在Python下尝试多线程编程

  这篇文章主要介绍了在Python下多线程编程的尝试,由于GIL的存在,多线程在Python开发领域一直是个热门问题,需要的朋友可以参考下 多任务可以由多进程完成,也可以由一个进程内的多线程完成. 我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程. 由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程. Python的标准库提供了两个模块:thread和thr

iOS多线程编程之三——GCD的应用

iOS多线程编程之三--GCD的应用 一.引言 在软件开发中使用多线程可以大大的提升用户体验度,增加工作效率.iOS系统中提供了多种分线程编程的方法,在前两篇博客都有提及: NSThread类进行多线程编程:http://my.oschina.net/u/2340880/blog/416524. NSOperation进行多线程操作编程:http://my.oschina.net/u/2340880/blog/416782. 上两个进行多线程编程的机制都是封装于Object-C的类与方法.这篇博

C语言多线程编程

原文:C语言多线程编程 注:本文内容来源于互联网,感谢作者整理! Windows的多线程编程 c语言 在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread    使用API函数CreateThread创建线程时,其中的线程函数原型:  DWORD WINAPI ThreadProc(LPVOID lpParameter);在线程函数返回后,其返回值用作调用Ex

Android多线程编程AsyncTask详解教程

Android中多线程编程中AsyncTask类的详细解释1.Android单线程模型2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类1.子线程中更新UI2.封装.简化异步操作.3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例2.必须在UI线程中调用AsyncTas

初探linux pthread多线程编程

多线程的创建,pthread_create: 1 //头文件 2 #include<pthread.h> 3 //函数声明 4 intpthread_create(/*指向线程标识符的指针*/,/*线程属性参数,通常为NULL*/,/*返回值是void类型指针的函数 */,/*运行函数的参数*/); 5 //成功返回0,失败返回错误编号. 注意:被创建的线程可能在pthread_create执行完毕之前就开始执行. 编译注意:编译时注意加上-lpthread参数,以调用静态链接库.因为pthr

《Java多线程编程核心技术》——1.2节使用多线程

1.2 使用多线程想学习一个技术就要"接近"它,所以在本节,首先用一个示例来接触一下线程.一个进程正在运行时至少会有1个线程在运行,这种情况在Java中也是存在的.这些线程在后台默默地执行,比如调用public static void main()方法的线程就是这样的,而且它是由JVM创建的.创建示例项目callMainMethodMainThread,创建Test.java类.代码如下: package test; public class Test { public static

.Net下的多线程编程

多线程是很多驾驭体系所具有的特性,它能大大提升程序的运行效率,因此多线程编程技艺为编程者遍及关切.眼前微软的.Net战略正进一步推进,各种相干的技艺正为盛大编程者所接纳,同样在.Net中多线程编程技艺具有 ... 多线程是很多驾驭体系所具有的特性,它能大大提升程序的运行效率,因此多线程编程技艺为编程者遍及关切.眼前微软的.Net战略正进一步推进,各种相干的技艺正为盛大编程者所接纳,同样在.Net中多线程编程技艺具有相称首要的地位.本文我就向大众介绍在.Net下进行多线程编程的基本办法和程序.开始