Delphi多线程学习(11):多线程图形操作
VCL对象不是线程安全的,而且它们的属性和方法必须要从VCL主线程中进行访问或被执行,但有两种VCL对象是例外的情况,它们是线程安全的。一种是任何图形对象,另一种是TThreadList。
这意味着不必非得在主VCL线程中才能设置一个画布的画笔颜色,或画刷类型,可以在另一个线程的环境中完成一点。对于图形对象,使用Lock和UnLock,而对于ThreadList,则使用LockList和UnLockList,这些方法的行为类似于临界区,在调用它们的时候会阻止其他线程的执行。因为Lock会中断所有线程的执行,所以如果使用不正确的话,应用程序性能会有很大下降。比如:
Form1.Canvas.Lock;
For i := 0 to 10000 do
begin
Form1.Canvas.TextOut(20,20,str);
end;
Form1.Canvas.UnLock;上面这个代码中,Lock后再循环,则循环结构过于拥挤,锁定时间过长。所以应该将Lock与UnLock放在循环里面。
下面的例子,通过多线程对窗体画布进行画线。点“开始”菜单创建N个线程同时往窗体画线,点“结束”同时终止N个线程。
{主窗体代码}
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, Menus;
type
TForm2 = class(TForm)
MainMenu1: TMainMenu;
S1: TMenuItem;
T1: TMenuItem;
procedure S1Click(Sender: TObject);
procedure T1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
List:TList;
implementation
uses DrawThread;
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
List:=TList.Create;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
List.Free;
end;
//“开始”菜单
procedure TForm2.S1Click(Sender: TObject);
var
value:string;
i: Integer;
begin
value:=InputBox('提示','请输入需要创建多少线程:','3');
try
for i := 0 to StrToInt(value) - 1 do
List.Add(TDrawThread.create(self));
except
on e:Exception do
相关文档:
如何调试DLL,在这里就不再赘述了,但是,今天就碰到了一个特别奇怪的问题,参数设置正确,就是不能调试?? 通过上网查资料,发现了问题,注意:
1, 将Project主菜单的Project Options对话框的Compiler页面Debugging选项中的 Debug informaton、Local symbols、Assertions复选框选中
2,将Tools主菜单的D ......
TThread是一个抽象类,用于在delphi中创建线程。
创建一个TThread的子类对象即相当于创建一个线程。
当一个应用程序运行时,应用程序就被载入内存准备执行。此时,它成为包含一个或多个线程的进程。线程执行应用程序的部分内容,并由操作系统分配CPU时间。同一进程的所有线程共享同一地址空间,可以访问进程的全局变量 ......
Delphi提供的字符串函数里有一个Pos函数,它的定义是:
function Pos(Substr: string; S: string): Integer;
它的作用是在字符串S中查找字符串Substr,返回值是Substr在S中第一次出现的位置,如果没有找到,返回值为0。
使用pos函数来查找字符第一次出现的位置
var
str1:string;
i,j:integer;
begin
str1:='dsf465 ......
上文中,多线程同步主窗体的Label的Caption属性值,发现一个问题:使用Synchronize用于同步的时候,主窗体好像死掉一样;而直接用子程序为Label的引用赋值,则有时会出现“Canvas does not allow drawing”错误。书上说VCL同步一定要用Synchronize,而不能直接访问。
测试:
{主窗体} ......