<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; gzcszzx</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/gzcszzx/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>现在, Delphi 的多线程已经非常易用了!</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/06/24/delphi/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/06/24/delphi/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 09:01:31 +0000</pubDate>
		<dc:creator>gzcszzx</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/06/24/delphi/</guid>
		<description><![CDATA[  先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): {自定义方法: 在窗体上绘制...} procedure MyMethod; var i: Integer; begin for i := 0 to 500000 do begin Form1.Canvas.Lock; Form1.Canvas.TextOut(10, 10, IntToStr(i)); Form1.Canvas.Unlock; end; end; {调用上面的自定义方法} procedure TForm1.Button1Click(Sender: TObject); begin MyMethod; end; 修改为多线程(只修改一行代码): procedure MyMethod; var i: Integer; begin for i := 0 to 500000 do begin Form1.Canvas.Lock; Form1.Canvas.TextOut(10, 10, IntToStr(i)); Form1.Canvas.Unlock; end; end; [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体):</p>
<p>{自定义方法: 在窗体上绘制...}<br />
procedure MyMethod;<br />
var<br />
i: Integer;<br />
begin<br />
for i := 0 to 500000 do<br />
begin<br />
Form1.Canvas.Lock;<br />
Form1.Canvas.TextOut(10, 10, IntToStr(i));<br />
Form1.Canvas.Unlock;<br />
end;<br />
end;</p>
<p>{调用上面的自定义方法}<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
MyMethod;<br />
end;</p>
<p>修改为多线程(只修改一行代码):</p>
<p>procedure MyMethod;<br />
var<br />
i: Integer;<br />
begin<br />
for i := 0 to 500000 do<br />
begin<br />
Form1.Canvas.Lock;<br />
Form1.Canvas.TextOut(10, 10, IntToStr(i));<br />
Form1.Canvas.Unlock;<br />
end;<br />
end;</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
TThread.CreateAnonymousThread(MyMethod).Start; //!!!<br />
end;</p>
<p>代码分析:</p>
<p>1、TThread 现在增加了许多 class 方法(直接通过类名调用的方法), TThread.CreateAnonymousThread() 就是比较有用的一个.</p>
<p>2、顾名思义, CreateAnonymousThread 是建立匿名线程对象, 它的参数是我们需要在线程中执行的方法.</p>
<p>3、但 CreateAnonymousThread 建立线程后是挂起的, 需要手动运行它; 后面的 Start 方法就是用来唤醒线程的.</p>
<p>4、(以前)唤醒线程还可以使用 Resume 方法或 Suspended 属性(Suspended := False;); 但它们即将被废弃了, 现在应使用 Start 来启动线程.</p>
<p>CreateAnonymousThread 的参数类型 TProc 是匿名方法(reference), 所以代码可以简写为:</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
TThread.CreateAnonymousThread( //直接写入方法体<br />
procedure<br />
var<br />
i: Integer;<br />
begin<br />
for i := 0 to 500000 do<br />
begin<br />
Canvas.Lock;<br />
Canvas.TextOut(10, 10, IntToStr(i));<br />
Canvas.Unlock;<br />
end;<br />
end //此处无分号<br />
).Start;<br />
end;</p>
<p>延时执行:</p>
<p>var<br />
myThread: TThread;</p>
<p>procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
myThread := TThread.CreateAnonymousThread(<br />
procedure<br />
var<br />
i: Integer;<br />
begin<br />
for i := 0 to 500000 do<br />
begin<br />
Canvas.Lock;<br />
Canvas.TextOut(10, 10, IntToStr(i));<br />
Canvas.Unlock;<br />
end;<br />
end<br />
);<br />
end;</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
myThread.Start;<br />
end;</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/06/24/delphi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

