很急的一个问题 面试时遇到的。对于分布式应用程序,数据库,应用程序端,客户端。现在要求编一个简单的应用程序,体现这样的思想:对于不同的客户访问,假设为A,B,C,D四个客户的同时访问,这个应用程序要能分别给这四个客户一个访问的线程。小弟没有涉足过多线程的编程 现在一点思路也没有 那位大哥能够指点?:)
或者有什么源程序参考的。多谢了 分数不够可以再加。
或者有什么源程序参考的。多谢了 分数不够可以再加。
解决方案 »
- delphi 如何取table1某个单元格的值
- 跪求打印纸张大小的设置
- 请哪位英语好的朋友帮着翻译一小句英文
- 使用了ehlib等一些控件,在调试程序的时候总会跑到控件的代码中去,我把控件的的pas删除只保留dcu文件,在出错的时候又提示找不到控件??.
- help~请问哪里能下载DELPHI 8.0~~
- 高分150解决个小问题!
- 请问可否在‘QuickReport’报表预览状态在页面上添加文字?
- 几个控件的使用方法
- Visual Studio .NET Enterprise Architect(中文企业设计师本)哪儿有下???
- DBgridEH多行选定
- 高分求教INTRAWE的数据库问题
- 如用用代码打开指定网页及邮件?
\Program Files\Borland\Delphi6\Help\Examples\Prgrsbar
石磊
摘 要:实现多线程同步查询
关键字:多线程,同步查询
类 别:数据库
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;
yhjdelphi
摘 要:多线程的学习实例
关键字:多线程
类 别:API
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls,syncobjs;
type//创建读线程类
TReadThread = class(TThread)
private
procedure Update;
protected
procedure Execute;override;
end;
//////////////////////////////////////////////////////////
type//创建显示线程类
TdisplayThread=class(TThread)
private
procedure Update;
protected
procedure Execute;override;
end;
//////////////////////////////////////////////////////////
type ////创建主窗口
TForm1 = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
procedure N4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
ReadThread:TReadThread;
Displaythread:TdisplayThread;
ReadEvent:TEvent;
DisplayEvent:TEvent;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.N4Click(Sender: TObject);
begin
Close();
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ReadEvent:=TEvent.Create(nil,true,false,'readthread');
readevent.ResetEvent; //创建读线程并且设置无信号状态 DisplayEvent:=Tevent.Create(nil,true,true,'displaythread');
displayEvent.SetEvent;//创建显示线程并且设置有信号状态
//创建线程
ReadThread:=TReadThread.Create(true);
readthread.FreeOnTerminate:=false;
Displaythread:=TdisplayThread.Create(true);
displaythread.FreeOnTerminate:=false;
end;procedure TForm1.N3Click(Sender: TObject);
begin
ReadThread.Suspend;
Displaythread.suspend;
end;procedure TForm1.N2Click(Sender: TObject);
begin
Memo1.Clear;
ReadThread.Resume;
Displaythread.Resume;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
ReadThread.Free;
Displaythread.Free;
ReadEvent.Free;
DisplayEvent.Free;
end;{ TReadThread }procedure TReadThread.Execute;
begin
inherited;
while Form1.DisplayEvent.WaitFor(1000)=wrsignaled do
begin
if terminated then exit;
Form1.Displayevent.ResetEvent;
Synchronize(update);
form1.ReadEvent.SetEvent;
end;end;procedure TReadThread.Update;
begin
Form1.Memo1.Lines.Append('正在执行::读线程');
end;{ TdisplayThread }procedure TdisplayThread.Execute;
begin
inherited;
while Form1.ReadEvent.WaitFor(1000)= wrsignaled do
begin
if terminated then exit;
Form1.ReadEvent.ResetEvent();//设置读事件无信息状态
Synchronize(update);
Form1.DisplayEvent.SetEvent;
end;end;procedure TdisplayThread.Update;
begin
Form1.Memo1.Lines.Append('正在执行::显示线程');
end;end.