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
相关文档:
一个选单大致是这样:
1.可以被以某种形式呼叫出来,如按下esc;
2.在这个选单中功能键有不同的定义,如原本方向键控制走路,但现在改为控制光标的位置;
3.按下确定键后有对应功能被执行;
4.可以被关闭。
那么我的办法是编写两个子程,其中一个处理选单中的事件,另外一个专门负责画选单。
在从步行切换到选单 ......
使用delphi多年,前些天忽然遇到不会string转pbyte,很是失落,此时对于编程基本功的重要性深有体会.这其中用到MOVE函数.
使用delphi多年,前些天忽然遇到不会string转pbyte,很是失落,此时对于编程基本功的重要性深有体会.这其中用到MOVE函数.
搞了好一会才搞明白其用法.所以想贴出来帮助需要帮助的人.
var
&nb ......
Delphi使用资源文件全攻略
在通常情况下使用delphi设计程序,都是将字符串、图像等资源直接使用delphi提供的vcl控件加到*.dfm中,这样做会合修改这些资源时带来不便,如果资源被多次引用,这些资源在程序启动时都被加载到内存中,非常耗费系统资源。因此,这就需要一种新的引用资源的文件:资源文件。资源 ......
临界区是一段代码,一次只允许一个线程执行这段代码。当把一段代码放入一个临界区, 线程执行到临界区时就独占了, 其他线程如果要访问这段代码,一定要等前一个访问的线程结束才行。借用前面的比喻比作图书馆,临界区就像把图书馆设计成只有一个位置(现实中好像不太合理,不管了,反正这么个意思),当有一个人正在办 ......
Event事件用法与Mutex差不多,但它可以使用:SetEvent(启动运行)ResetEvent(暂停运行)、PulseEvent(执行一次后立即暂停)。
先看一下创建函数:CreateEvent(
......