关于线程的问题,请高手相助!
我准备写一个程序,定期从某网站上取数据,写入本地数据库。由于网站是PHP+Mysql,空间商不开放3306端口,所以我就写了一个接口文件,放在网站上,接口文件访问数据库,将数据库里的数据提取出来,以xml文件的形式返回,delphi就从接口文件中读取节点,然后写入数据库,我有9个表要更新,因此将每个表的更新写入了一个线程。在主窗体中一个表一个表地更新,我目前已经写了5个表的更新程序,竟然发现5个线程同时运行,我不需他们同时运行,而且我担心这样会不会拖垮网站服务器?如果何能让这几个进程排队运行,也就是表一更新完了,接着更新表二的。亦或者是我的思路出了问题?
以下是我的线程代码:
unit TMyTread;
interface
uses
Windows,StdCtrls,Classes,ADODB,SysUtils,Controls,ReadXML,XMLDoc,xmldom,XMLIntf,conn,Dialogs;
type
MyTread = class(TThread)
private
GOODSLIST:TStringList;
UpdateType:string;
Get_Sql:string;
GOds_id,cat_ID,IMGID,PRICE,ID,Link_ID,BRAND:Integer;
MEMO:TMemo;
protected
procedure Execute; override;
procedure DownLoadGoods;//下载商品资料
procedure DownLoadGoods_cat;//下载商品扩展分类
procedure DownLoadGoods_gallery;//下载商品相册
procedure DownLoadMember_price;//下载会员价
procedure DownLoadLink_goods;//下载相关商品
public
constructor Create(SQLText:string;AUPDATETYPE:string;TT:TStringList;MM:TMemo);
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TMyTread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TMyTread }
constructor MyTread.Create(SQLText:string;AUPDATETYPE:string;TT:TStringList;MM:TMemo);
begin
inherited Create(False);
Get_Sql:=SQLText;
GOODSLIST:=TStringList.Create;//此处的stringlist变量由主窗体传入
GOODSLIST:=TT;
UpdateType:=AUPDATETYPE;//根据此变量确定更新哪个表
MEMO:=MM;
MEMO.Clear;
FreeOnTerminate:=True;
end;
procedure MyTread.Execute;//根据传入的AUPDATETYPE的值,来确定运行哪个过程。
var
i,j:Integer;
begin
i:=GOODSLIST.Count;
//ShowMessage(IntToStr(i));
if UpdateType='goods' then
begin
for j:=0 to i-1 do
begin
GOds_id:=StrToInt(GOODSLIST[j]);
Synchronize(DownLoadGoods);
//Sleep(50);
end ;
end
else if UpdateType='goods_cat' then
begin
for j:=0 to i-1 do
begin
ID:=StrToInt(GOODSLIST[j]);
Synchronize(DownLoadGoods_cat);
end;
end
else if UpdateType='goods_gallery' then
begin
for j:=0 to i-1 do
begin
IMGID:=StrToInt(GOODSLIST[j]);
Synchronize(DownLoadGoods_gallery);
end;
end
else if UpdateType='member_price' then
begin
for j:=0 to i-1 do
begin
PRICE:=StrToInt(GOODSLIST[j]);
Synchronize(DownLoadMember_price);
end;
end
else if UpdateType='link_goods' then
begin
for j:=0 to i-1 do
begin
Link_ID:=StrToInt(GOODSLIST[j]);
Synchronize(DownLoadLink_goods);
end;
end;
if Terminated then
Exit;
end;
//以下由于代码太长,所以略去
将几个线程写入一个线程类里,如果要排队运行,难不成要建几个线程类?求大侠们指点迷津。
[解决办法]
笨点的写法。。在第一个线程的OnTerminate事件里,创建第二个线程。。。依次类推~