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
相关文档:
CTRL+SPACE 代码补全,很好用的(先改了输入法热键)
CTRL+SHIFT+C 编写申明或者补上函数
CTRL+SHIFT+↑(↓) 在过程、函数、事件内部, 可跳跃到相应的过程、函数、事件的定义(在INTERFACE和IMPLEMENTATION之间来回切换)
CTRL+SHIFT+G 插入GUID
CTRL+J (弹出DELPHI语句提示窗口,选择所需语句将自动完成一条 ......
现有一系统不定时在同一目录下生成一批txt文件,内容大概如下;
20100112_164910,6,81406392,808,113,,
为方便统计,需要将这些txt文件中的数据读入数据表中.
现有两种方法:
一是直接将数据读入到数据表中的某一列中,再用sql 语句拆开成几列:
  ......
Delphi使用资源文件全攻略
在通常情况下使用delphi设计程序,都是将字符串、图像等资源直接使用delphi提供的vcl控件加到*.dfm中,这样做会合修改这些资源时带来不便,如果资源被多次引用,这些资源在程序启动时都被加载到内存中,非常耗费系统资源。因此,这就需要一种新的引用资源的文件:资源文件。资源 ......
临界区是一段代码,一次只允许一个线程执行这段代码。当把一段代码放入一个临界区, 线程执行到临界区时就独占了, 其他线程如果要访问这段代码,一定要等前一个访问的线程结束才行。借用前面的比喻比作图书馆,临界区就像把图书馆设计成只有一个位置(现实中好像不太合理,不管了,反正这么个意思),当有一个人正在办 ......
一个线程的优先级取决于创建线程的进程的优先级(priority class)和线程本身相对的优先级(relative priority)。
1、进程优先级:
不同操作系统 优先级数目不同。Windows2000以上的版本列表如下:
Idle:(标志:IDLE_PRIORITY_CLASS,值为$40);
Below Normal:(标志:BEL ......