⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 026.htm

📁 Delphi书籍--Delphi网上教程
💻 HTM
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI专题--入门技巧-->用Delphi编程时如何利用线程</TITLE>
<META NAME="keywords" CONTENT=" DELPHI专题--入门技巧 用Delphi编程时如何利用线程">
<META NAME="description" CONTENT=" - DELPHI专题--入门技巧 - 用Delphi编程时如何利用线程">

<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>

<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<a href="index.html">返回</a>

<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>

<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">用Delphi编程时如何利用线程</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
  <p><br>
<br>
----Windows95是Microsoft公司的第一个真正的多任务操作系统。在每一时刻可以有多个进程同时工作,而每一个进程又包含有多个线程。但只有一个处理器的计算机不可能真正地“同时”执行多个线程,而是操作系统把时间分成若干个时间片,然后把一个个时间片分配给每一个线程。<br>
<br>
----一个执行了的程序就是一个进程,一个进程则至少有一个主线程。一位高级程序员,绝不会让自己的程序里面只有一个主线程存在(除非只有很少的几十行代码),而是尽量让自己的程序在同一时刻里干更多的事,在比较大一点的应用中尤其如此,象数据库应用程序,在统计的时候我还想做其他事呢!因此,如何有效地利用线程则是每一个程序员都应了解的。本文就此简单地谈一下在Delphi中如何利用线程。<br>
<br>
----(一)当使用线程时,我们主要有两个任务:<br>
----(1)创建一个线程。<br>
----(2)创建一个能作为线程入口的函数。<br>
  ----WindowsAPI调用CreateThread函数来创建一个线程。函数如下:<br>
<br>
HANDLE CreateThread(LPSECURITY_<br> 
  ATTRIBUTESlpThreadAttributes,<br> 
//线程安全属性地址<br> 
  DWORDdwStackSize,<br> 
//初始化线程堆栈尺寸<br> 
  LPTHREAD_START_ROUTINElpStartAddress,<br> 
//线程函数所指向的地址<br> 
  LPVOIDlpParameter,<br> 
//给线程函数传递的参数<br> 
  DWORDdwCreationFlags,<br> 
//有关线程的标志<br> 
LPDWORDlpThreadId<br> 
//系统分配给线程的ID<br> 
);<br> 
----第一个参数是安全属性,一般设为nil,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。<br> 
----第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。<br> 
----第三个参数,也是最重要的一个,是一个指向函数名的指针,但传递时很简单,只需在线程函数名前加上@就可以了。<br> 
----第四个参数是你需要向线程函数传递的参数,一般是一个指向结构的指针。不需传递参数时,则这个参数设为nil。<br> 
----第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配给CPU时间,只有当ResumeThread函数被调用后才能执行;当然,也可以调用SuspendThread函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被立即调用。一般传为0即可。<br> 
----最后一个参数是系统分配给这个线程的唯一的ID标志。<br> 
----下面这个程序MyThreadPro.pas介绍了线程如何建立及使用:<br> 
<br> 
//Your first test Thread Program.<br>  
unit MyThreadPro;<br> 
interface<br> 
uses<br> 
  Windows,Messages,SysUtils,Classes,<br> 
  Graphics,Controls,Forms,Dialogs,<br> 
  StdCtrls;<br> 
type<br> 
  TForm1=class(TForm)<br> 
  UsedThread:TButton;<br> 
  NoUsedThread:TButton;<br> 
procedure UsedThreadClick(Sender:TObject);<br> 
procedure NoUsedThreadClick(Sender:TObject);<br> 
var<br> 
Form1:TForm1;<br> 
implementation<br> 
  {$R*.DFM}<br> 
//这是线程函数,<br> 
它可以放在下面程序的任何地方<br> 
function MyThreadFunc(P:pointer):Longint;stdcall;<br> 
var<br> 
  i:integer;<br> 
  DC:HDC;<br> 
  S:string;<br> 
begin<br> 
DC:=GetDC(Form1.Handle);<br> 
for i:=0 to 100000 do begin<br>  
  S:=Inttostr(i);<br> 
  Textout(DC,10,10,Pchar(S),length(S));<br> 
end;<br> 
ReleaseDC(Form1.Handle,DC);<br> 
end;<br> 
procedure TForm1.UsedThreadClick(Sender:TObject);<br>  
var<br> 
  hThread:Thandle;//定义一个句柄<br> 
  ThreadID:DWord;<br> 
begin<br> 
//创建线程,同时线程函数被调用<br> 
  hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);<br> 
  ifhThread=0then<br> 
  messagebox(Handle,'Didn’tCreateaThread',nil,MB_OK);<br> 
end;<br> 
procedure TForm1.NoUsedThreadClick(Sender:TObject);<br>  
begin<br> 
  MyThreadfunc(nil);<br> 
//没有创建线程时,直接调用线程函数<br> 
end;<br> 
end.<br> 
----上面这个程序介绍了我们在使用线程及未使用线程二种情况下,运行该程序的反应。当点UsedThread按钮时,则建立一个线程,这时我们可以在程序进行计算的同时,改变窗体的尺寸及移动它。当按下NoUsedThread按钮时,不建立线程,我们会发现在程序没有计算完之前根本不能做其它任何事情!<br> 
此程序在基于Windows95的Delphi3中运行通过。 
 
</TR> 
</table> 
</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -