大清早送分200,并问高手一个问题? 本着"分不在高够用就行"的原则,现送分200.呵呵 顺便问一下: 我创建了一个线程类,我怎么知道有几个线程(实例)在运行, 又如何同时terminate它们?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我给你个思路,解决你的没问题在API参考大全里有个线乘的部分,里面的很多API可以解决你的问题,就是让你一个一个查API! 哥们,在创建的时候,取得线程指针,保存到一个tlist中。 Delphi中实现多线程同步查询 摘 要:实现多线程同步查询关键字:多线程,同步查询类 别:数据库 unit Unit1;interfaceuses 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. if not SocketServer的话每次创建一个线程,就将线程加1, 释放时就减1.if SocketServer 的话可用函数:Thread.ServerSocket.ActiveThreads和Thread.ServerSocket.IdleThreads来取得正在运行的线程数。 如果说不能得到有哪几个线程存在,那么flashget下载时,你点击停止它是怎么实现全部线程挂起呢?说通俗一点就是,一个类的几个实例的问题?up TThread.execute//写出线程需要完成的代码TThread.Terminate方法//终止线程!有问题请发信息到我的E-mail:[email protected] 怎样终止线程,上面已经有兄弟说到了。不够的,再看看帮助吧至于要知道自己的几个线程类的实例在运行,一般都要自己记录下来,每创建,运行一个或终止一个都记下来。也有枚举线程的API函数,不过一者,枚举到的不一定都是你的线程类的实例的句柄,二者,效率低下。还是自己纪录一下好,简单,方便,快捷 采用信号灯技术线程创建时信号量+1Free的时候信号量-1信号量置为-1时,所有线程停止这需要线程定时检查信号量的值主线程控制信号量,这方法可以实现NetANts/FlashGet等多线程的功能最大线程数目也可以通过信号量控制的 在创建线程时先声明一个线程对象,你利用这个对象就可以执行terminated方法了。要知道创建的线程个数,利用线程类数组或线程池就可以实现了,具体例子我可以写一个给你,但是现在手头没有,呵呵! DLL的参数调用问题 如何返回控件数组序号? 报表问题 高手帮忙,求读取XML消息包的例子 关于SOCKET阻塞模式和非阻塞模式稳定性的讨论。欢迎进来发表看法。 如何对 表格单元 的 点击 事件编程? 各位可否提供spcomm 的中文技术资料 在delphi中如何增加、修改SQL SERVER2000数据库的字段? ExtStringGrid怎们安装,安装上后怎么找到(从那可以找到)按装的控件 如何显示label1.caption:='Good ';颜色渐变 请教报表文件的打开方式问题 怎样处理一个3M多的文本文件?
在API参考大全里有个线乘的部分,里面的很多API可以解决你的问题,
就是让你一个一个查API!
Delphi中实现多线程同步查询 摘 要:实现多线程同步查询
关键字:多线程,同步查询
类 别:数据库
unit Unit1;interfaceuses
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.
每次创建一个线程,就将线程加1, 释放时就减1.if SocketServer 的话
可用函数:Thread.ServerSocket.ActiveThreads和Thread.ServerSocket.IdleThreads来取得正在运行的线程数。
up
TThread.Terminate方法//终止线程!
有问题请发信息到我的E-mail:[email protected]
效率低下。还是自己纪录一下好,简单,方便,快捷
线程创建时信号量+1
Free的时候信号量-1
信号量置为-1时,所有线程停止这需要线程定时检查信号量的值主线程控制信号量,这方法可以实现NetANts/FlashGet等多线程的功能
最大线程数目也可以通过信号量控制的
要知道创建的线程个数,利用线程类数组或线程池就可以实现了,具体例子我可以写一个给你,但是现在手头没有,呵呵!