delphi下载文件多线程(求DELPHI多线程例程 快进来看看)
本文目录
求DELPHI多线程例程 快进来看看
优秀的数据库应用应当充分考虑数据库访问的速度问题。通常可以通过优化数据库、优化 查询语句、分页查询等途径收到明显的效果。即使是这样,也不可避免地会在查询时闪现一个带有 SQL符号的沙漏,即鼠标变成了查询等待。最可怜的是用户,他(她)在此时只能无奈地等待。遇到急性子的,干脆在此时尝试 Windows中的其它应用程序,结果致使你的数据库应用显示一大片白色的窗口。真是无奈! 本文将以简单的例子告诉你如何实现线程查询。还等什么,赶快打开Delphi对照着下面的完整源代码试试吧。 在查询时能够做别的事情或者取消查询,这只是基本的线程查询,在你阅读了Delphi有关线程帮助之后能立刻实现。这里介绍的是多个线程查询的同步进行。 在Delphi数据库应用中,都有一个缺省的数据库会话 Session。通常情况下,每个数据库应用中只有这一个会话。无论是查询函数修改数据,在同一时间内只能进行其中的一件事情, 而且进行这一件事情的时候应用程序不能响应键盘、鼠标以及其它的 Windows消息。这就是在 窗口区域会显示一片空白的原因所在。当然,只要将查询或数据操纵构造成线程对象,情况会好一些,至少可以接受窗口消息,也可以随时终止查询或数据操纵,而不会在屏幕上显示出太难看的白色。不过,这只是解决了问题的一部分。假如在进行一个线程查询的时候,用户通过 按钮或菜单又发出了另一个查询的命令,这可如何是好,难道终止正在执行的数据库访问吗? 解决之道就是:多线程同步查询。 实现多线程同步查询的基本思想是,为每一个查询组件(如TQuery组件)创建一个独占的 数据库会话,然后各自进行数据库访问。需要特别注意的是,因为Delphi中的 VCL组件大多都 不是线程安全的,所以应当在线程查询结束后再将DataSource组件与查询组件关联,从而显示 在DBGrid组件中。 下面的例子只实现了静态的线程同步查询,即线程对象是固定的,并随窗体的创建和销毁 而创建和销毁。你可以就此进行改进,为每一个数据查询或数据操纵命令创建一个单独的线程对象,从而达到多线程同步查询的目的。 注意:应用程序中的线程不是越多越好,因为线程将严重吞噬CPU资源,尽管看上去并不明显。谨慎创建和销毁线程将避免你的应用程序导致系统资源崩溃。 下面的例子给出了同时进行的两个线程查询。第一次按下按钮时,线程开始执行;以后每次按下按钮时,如果线程处于挂起状态则继续执行,否则挂起线程;线程执行完毕之后将连接 DataSource,查询结果将显示在相应的DBGrid中。 { 这里的多线程同步查询演示程序仅包括一个工程文件和一个单元文件 } { 窗体中放置的组件有: } { 两个Session组件 } { 两个Database组件 } { 两个Query组件 } { 两个DataSource组件 } { 两个DBGrid组件 } { 一个Button组件 } { 除非特别说明,否则上述各组件的属性都取默认值(见各组件注释) } { 对于Database组件,就和一般设置一样,有一个正确的连接即可 } { 对于Query 组件,需要在各自的属性 SQL中添加一些查询语句,为了 } { 看得更清除,建议不要在两个Query 组件中填写相同的查询语句。 } unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, Grids, DBGrids, StdCtrls; type TForm1 = class(TForm) Session1: TSession; { 属性SessionName填写为S1 } Database1: TDatabase; { 属性SessionName选择为S1 } Query1: TQuery;{ 属性Database选择为Database1;属性SessionName选择为S1 } DataSource1: TDataSource; { 属性DataSet设置为空 } DBGrid1: TDBGrid; { 属性DataSource选择为DataSource1 } Session2: TSession; { 属性SessionName填写为S2 } Database2: TDatabase; { 属性SessionName选择为S2 } Query2: TQuery;{ 属性Database选择为Database2;属性SessionName选择为S2 } DataSource2: TDataSource; { 属性DataSet设置为空 } DBGrid2: TDBGrid; { 属性DataSource选择为DataSource2 } BtnGoPause: TButton; { 用于执行和挂起线程 } procedure FormCreate(Sender: TObject); { 创建窗体时创建线程对象 } procedure FormDestroy(Sender: TObject); { 销毁窗体时销毁线程对象 } procedure BtnGoPauseClick(Sender: TObject); { 执行线程和挂起线程 } private public end; TThreadQuery = class(TThread) { 声明线程类 } private FQuery: TQuery; { 线程中的查询组件 } FDataSource: TDataSource; { 与查询组件相关的数据感知组件 } procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 } protected procedure Execute; override;{ 执行线程的方法 } public constructor Create(Query: TQuery; DataSource: TDataSource); virtual; { 线程构造器 } end; var Form1: TForm1; Q1, { 线程查询对象1 } Q2: TThreadQuery; { 线程查询对象2 } implementation {$R *.DFM} { TThreadQuery类的实现 } { 连接数据查询组件和数据感知组件} procedure TThreadQuery.ConnectDataSource; begin FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 } end; procedure TThreadQuery.Execute;{ 执行线程的方法 } begin try FQuery.Open; { 打开查询 } Synchronize(ConnectDataSource);{ 线程同步 } except ShowMessage(’Query Error’); { 线程异常 } end; end; { 线程查询类的构造器 } constructor TThreadQuery.Create(Query: TQuery; DataSource: TDataSource); begin FQuery := Query; FDataSource := DataSource; inherited Create(True); FreeOnTerminate := False; end; { 创建窗体时创建线程查询对象 } procedure TForm1.FormCreate(Sender: TObject); begin Q1 := TThreadQuery.Create(Query1, DataSource1); Q2 := TThreadQuery.Create(Query2, DataSource2); end; { 销毁窗体时销毁线程查询对象 } procedure TForm1.FormDestroy(Sender: TObject); begin Q1.Terminate; { 销毁之前终止线程执行 } Q1.Destroy; Q2.Terminate; { 销毁之前终止线程执行 } Q2.Destroy; end; { 开始线程、继续执行线程、挂起线程 } procedure TForm1.BtnGoPauseClick(Sender: TObject); begin if Q1.Suspended then Q1.Resume else Q1.Suspend; if Q2.Suspended then Q2.Resume else Q2.Suspend; end; end.
Delphi多线程问题
{注意哦,你的两个线程用的同一个变量装它们的句柄,这样是不对地,出错地原因是因为循环操作可视控件的时候,如果不排队,会出现同时访问的情况,最好是可以使用类的方式来使用线程}unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); // procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; hloopHandle:Thandle ; //线程 句柄 dloopThreadID:DWORD ; //线程 id //================ lpHandles:Thandle; lpTheradID:DWORD; function doloop(P:pointer):Longint;stdcall; Function StartEvent(S:pointer):Longint;stdcall;implementation{$R *.dfm}//按钮一procedure TForm1.Button1Click(Sender: TObject);begin hloopHandle:= CreateThread(nil,0,@doloop,nil,0,dloopThreadID); if hloopHandle=0 then begin messagebox(Handle,’Didn’t Create a Thread’,nil,MB_OK); abort; end;end;//按钮二procedure TForm1.Button2Click(Sender: TObject);begin lpHandles:= CreateThread(nil,0,@StartEvent,nil,0,lpTheradID); if lpHandles=0 then begin messagebox(Handle,’Didn’t Create a Thread’,nil,MB_OK); abort; end;end;//线程处理函数一function doloop(P:pointer):integer;stdcall;var i:integer;begin for i:=0 to 100000 do begin form1.Edit1.Text:=inttostr(i); sleep(100); end;end;//==================================//线程处理函数二Function StartEvent(S:pointer):integer;stdcall;var c:integer; begin for c:=0 to 100000 do begin form1.Edit2.Text:=inttostr(c); sleep(100); end; end;end.
delphi的P2P技术
作为一种技术就不限定某种语言。所以用delphi和其他的一样,需要学习网络编程:传递文件数据;多线程:多个peer端同时下载;临界区,共享数据访问,锁问题;数据结构:数据发送接收的格式,管理接收到的数据,还原文件
delphi多线程问题
我是这么做的:启动一个主线程,主线程用来分配线程任务、管理线程列表。先定义一个子线程数组,例如array of tthread,主线程不停循环(直至任务列表为空),循环中检查子线程数组里面线程的状态,一旦发现结束就立即分配给他任务,resum。
Delphi多线程怎么处理
给你一个简单的参考代码:delphi线程的创建、挂起、激活与终止proceduretform1.button1click(sender:tobject);begin//创建线程,同时线程函数被调用hthread:=createthread(nil,0,@mythreadfunc,nil,0,threadid);end;proceduretform1.button2click(sender:tobject);beginsuspendthread(hthread);//挂起线程end;proceduretform1.button3click(sender:tobject);beginresumethread(hthread);//激活线程end;proceduretform1.button4click(sender:tobject);beginterminatethread(hthread,0);// 终止线程end;
DELPHI怎么实现多线程 在线等
unit bncthrd; interface uses winprocs,classes,graphics,extctrls; type tbouncethread=class(tthread) private fshape:tshape; fxspeed:integer; fyspeed:integer; procedure moveshape; protected procedure execute;override; public constructor create(suspended:boolean;shape:tshape;xspeed,yspeed:integer); propertyshape:tshapereadfshape; end; implementation procedure tbouad.moveshape; var maxheight,maxwidth:integer; begin with fshape do begin left:=left+fxspeed; top:=top+fyspeed; if(left=0) or(left+width=parent.width)then fxspeed:=fxspeed*-1; if(top=0)or(top=height+parent.height)then fyspeed:=fyspeed*-1; end; end; procedure tbouncethread.execute; begin while not terminated do begin synchronize(moveshape); end; end; constructor tbouncethread.create(suspended:boolean;shape:tshape; xspeed,yspeed:integer); begin inherited create(suspended); fshape:=shape; fxspeed:=xspeed;{x轴走向的速度} fyspeed:=yspeed;{y轴走向的速度} freeonterminate:=true; end; end. 执行时我们可以新建一个程序,然后在uses部分加入以上的bncthrd单元,再在它的窗体form1上加入两个shape控件shape1和shape2,shape1可以是一个矩形而shape2 是一个圆。加入以下的代码就可以让矩形和圆动起来。 unit Unit1; interface uses bncthrd,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Shape1: TShape; Shape2: TShape; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin tbouncethread.create(false,shape1,1,2); tbouncethread.create(false,shape2,2,3); end; end.
delphi 多线程编程问题
多线程中使用方法注意以下几点就可以了!1.在更新VCL控件的时候使用Synchronize.2.如果线程内定义了全局变量,如果想修改它的话,一般常用临界,如果是多进程方式同步的话使用互斥等....3.你所说的使用synchonrize和不使用synchronize结果一样,没有什么区别.!这是在单个线程中没有发现问题,如果多个线程同时运行此段代码就会出现内存写入和读取错误了!
更多文章:
mysql需要安装所有的吗(局域网内多用户连接Mysql数据库,需要每个客户端上都安装Mysql吗)
2024年7月14日 05:06
animation属性unity(u3d里animator,animation有什么区别 吗)
2024年7月9日 12:54
感觉js逻辑总是不会写(学JS学不会,总是心理觉得浪费太多时间,如何学得快又能快掌握)
2024年7月19日 06:40
一个div浮在另一个div上面(HTML怎么将一个div放在另外一个div上面而不影响上面div的基本操作)
2024年7月24日 05:35
promise sb sth(promise sth to sb等于promise sb sth吗)
2024年7月22日 06:19
my sql官网下载(我从官网下载了mysql-5.6.14-win32怎么找不到安装程序)
2024年6月7日 06:03
c语言if语句的经典例子(c语言用if语句编程,输入一个三位数,判断是否为水仙花数)
2024年5月5日 11:51
病毒为什么用汇编写(为什大多数免杀,都将病毒文件反编译成汇编代码而不是高级语言代码 是不是为了统一)
2024年6月24日 09:02
radius认证失败是什么意思(校园网宽带连不上,显示: 客户端认证失败 radius online 1)
2024年8月26日 11:30