关于进程,线程的问题,欢迎各路大虾进来发表自己的意见,等待中~~~~~~~~ 进程,线程是一对很容易搞糊涂的概念,以前我对此概念很清楚,但最近又模糊了希望哪位大虾能彻底把 进程,线程 讲清楚最好还能举出了一些在实际的开发中例子了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也说两句(刚学的)进程是由至少一个线程组成的。线程才是获得cpu时间片的最小单位。用线程技术编程不是程序员必会的,但会用线程编程才称得上是好的程序员。我有例程 要的话 可以发给你。 在DELPHI的数据库开发中,如何来运用线层,有无了实际例子啦 再补充一点:把商店消失(CTRL+ALT+DEL)了,那么所有的进程都被强制结束了。如果所有的线程都执行完毕并且某个线程负责销毁商店,那么表示进程正常结束。 至于数据库中使用多线程,俺的建议是需要合理规划,否则很容易发生数据访问冲突。俺有一个例子,供楼主参考(原版CCIDNET,不好意思,俺的原创):http://lzw222.myrice.com/3-SeverJiShu/Sever_wz/sever49.htm 就像一座正在下课的教学楼。教学楼只有一个大门,这就是cup,假设每次只能出来一个人。每个教室都有自己的门,这就是进程。每个教室有很多学生(可能是1个,或多个),都要出来,假设也是一个一个得出来。////////////////////////////操作系统+应用程序就是这个挤满学生,都想出来的大楼。cpu同一时刻只能处理一条指令,就像教学楼大门同时只能出去一个人,一个人就是一条指令。先后从楼大门出去的学生不一定是哪个教室的,只要他能挤,这就是优先级高。当某个学生在门口处因为等自己的女朋友不愿意除去,又不能回头的时候,别人谁也别想出去,就是死锁。当学生走差不多的时候,大门比较轻松,这是候cpu的占用率较低。当然,大楼着火,只有一个楼门,防火设备不好使,学生只能从窗户跳下。这就是操作系统崩溃! http://lzw222.myrice.com/3-SeverJiShu/Sever_wz/sever49.htm 给你一个小例子:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DBTables, Db, Grids, DBGrids,threadsql;type TForm1 = class(TForm) DBGrid1: TDBGrid; DBGrid2: TDBGrid; DataSource1: TDataSource; DataSource2: TDataSource; Query1: TQuery; Query2: TQuery; Database1: TDatabase; Database2: TDatabase; Session1: TSession; Session2: TSession; Button1: TButton; Table1: TTable; Database3: TDatabase; Session3: TSession; DataSource3: TDataSource; DBGrid3: TDBGrid; Button2: TButton; Edit1: TEdit; Button3: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;varForm1: TForm1;Q1, { 线程查询对象1 }Q2: TThreadQuery; { 线程查询对象2 }implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);beginQ1 := TThreadQuery.Create(table1, Query1, DataSource1);Q2 := TThreadQuery.Create(table1, Query2, DataSource2);end;procedure TForm1.FormDestroy(Sender: TObject);beginQ1.Terminate; { 销毁之前终止线程执行 }Q1.Destroy;Q2.Terminate; { 销毁之前终止线程执行 }Q2.Destroy;end;procedure TForm1.Button1Click(Sender: TObject);begin//if Q1.Suspended then Q1.Resume else Q1.Suspend;//if Q2.Suspended then Q2.Resume else Q2.Suspend;Q1.Resume;Q2.Resume;application.ProcessMessages;end;procedure TForm1.Button2Click(Sender: TObject);beginDataSource3.DataSet := Table1;Table1.Active := True;end;procedure TForm1.Button3Click(Sender: TObject);var i,v : integer;begin v := 1; for i := 1 to 100 do begin inc(v); end; Edit1.Text := inttostr(i);end;end. 线程unit:unit threadsql;interfaceuses Classes,db,DbTables,Dialogs;type TThreadQuery = class(TThread)privateFTable : TTable;FQuery: TQuery; { 线程中的查询组件 }FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }protectedprocedure Execute; override;{ 执行线程的方法 }publicconstructor Create(table : TTable;Query: TQuery;DataSource: TDataSource); virtual; { 线程构造器 }end;implementation{ Important: Methods and properties of objects in VCL can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TThreadQuery.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }{ TThreadQuery }{ TThreadQuery类的实现 }{ 连接数据查询组件和数据感知组件}procedure TThreadQuery.ConnectDataSource;beginFDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }end;procedure TThreadQuery.Execute;{ 执行线程的方法 }begintrySynchronize(ConnectDataSource);{ 线程同步 }exceptShowMessage('Query Error'); { 线程异常 }end;end;{ 线程查询类的构造器 }constructor TThreadQuery.Create(Table: TTable; Query: TQuery; DataSource: TDataSource);beginFQuery := Query;FTable := table;FDataSource := DataSource;inherited Create(True);FreeOnTerminate := False;end;end. 做个好人,属需要UML精髓电子版?留个Mail.临外撒分 请帮助看一下符号: ^ 在下面的语句中是什么意思---------在线等待!!!! dbgrid滚动条的问题 谁有DevExpress的DBTreeView控件? 请到这里帮个忙 奇怪,我这句怎么通不过呢:if assigned(FChild)<>nil then LISTVIEW的图标可以设间距吗? 怎样得到一个 jpg图片的大小?? TclientDataSet高分求解! 有认知道厘米和象素的关系 已经动态配置了ODBC,请问如何使程序内的adoconnection连接到这个ODBC? 又有问题,大家来看看
进程是由至少一个线程组成的。线程才是获得cpu时间片的最小单位。
用线程技术编程不是程序员必会的,但会用线程编程才称得上是好的程序员。
我有例程 要的话 可以发给你。
如果所有的线程都执行完毕并且某个线程负责销毁商店,那么表示进程正常结束。
http://lzw222.myrice.com/3-SeverJiShu/Sever_wz/sever49.htm
每个教室都有自己的门,这就是进程。
每个教室有很多学生(可能是1个,或多个),都要出来,假设也是一个一个得出来。////////////////////////////操作系统+应用程序就是这个挤满学生,都想出来的大楼。cpu同一时刻只能处理一条指令,就像教学楼大门同时只能出去一个人,一个人就是一条指令。先后从楼大门出去的学生不一定是哪个教室的,只要他能挤,这就是优先级高。当某个学生在门口处因为等自己的女朋友不愿意除去,又不能回头的时候,别人谁也别想出去,就是死锁。当学生走差不多的时候,大门比较轻松,这是候cpu的占用率较低。
当然,大楼着火,只有一个楼门,防火设备不好使,学生只能从窗户跳下。
这就是操作系统崩溃!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DBTables, Db, Grids, DBGrids,threadsql;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DataSource1: TDataSource;
DataSource2: TDataSource;
Query1: TQuery;
Query2: TQuery;
Database1: TDatabase;
Database2: TDatabase;
Session1: TSession;
Session2: TSession;
Button1: TButton;
Table1: TTable;
Database3: TDatabase;
Session3: TSession;
DataSource3: TDataSource;
DBGrid3: TDBGrid;
Button2: TButton;
Edit1: TEdit;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Q1, { 线程查询对象1 }
Q2: TThreadQuery; { 线程查询对象2 }implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(table1, Query1, DataSource1);
Q2 := TThreadQuery.Create(table1, Query2, DataSource2);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate; { 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate; { 销毁之前终止线程执行 }
Q2.Destroy;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
//if Q1.Suspended then Q1.Resume else Q1.Suspend;
//if Q2.Suspended then Q2.Resume else Q2.Suspend;
Q1.Resume;
Q2.Resume;
application.ProcessMessages;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
DataSource3.DataSet := Table1;
Table1.Active := True;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i,v : integer;
begin
v := 1;
for i := 1 to 100 do begin
inc(v);
end;
Edit1.Text := inttostr(i);
end;end.
unit threadsql;interfaceuses
Classes,db,DbTables,Dialogs;type
TThreadQuery = class(TThread)
private
FTable : TTable;
FQuery: TQuery; { 线程中的查询组件 }
FDataSource: TDataSource; { 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute; override;{ 执行线程的方法 }
public
constructor Create(table : TTable;Query: TQuery;DataSource: TDataSource); virtual; { 线程构造器 }
end;implementation{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TThreadQuery.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }{ TThreadQuery }
{ TThreadQuery类的实现 }{ 连接数据查询组件和数据感知组件}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;
procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error'); { 线程异常 }
end;
end;{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Table: TTable; Query: TQuery; DataSource: TDataSource);
begin
FQuery := Query;
FTable := table;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;end.