请教有关多线程问题--急 [100分] ( 积分: 100 )

  • 主题发起人 主题发起人 qiuxing009
  • 开始时间 开始时间
Q

qiuxing009

Unregistered / Unconfirmed
GUEST, unregistred user!
才学多线程。。下面这个不知道错在那里。。请教各位大侠。。。
unit ThreadHZ;
interface
uses
Classes,ComCtrls,ADODB,SysUtils,Dialogs,Forms;
type
ReSZ=array of Extended;
HZThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
public
ListV:TListView;
AQ:TADOQuery;
ProBar:TProgressBar;
constructor Create(LVName:TListView;AQuery:TADOQuery;PBarName:TProgressBar);
//构造函数
function DateHZ():ReSZ;
Function OpenTable( StrSQL: String;
AQ : TADOQuery ) : Integer;
function KToZero(K:String):Extended;
//将数据转换为 Extended类型
end;

implementation
function HZThread.DateHZ(): ReSZ;
var
iloop,i,n:Integer;
JG:array [1..28,1..21] of Extended;
//1..27
SY:array [1..28,1..21] of Extended;
ZD:TStringList;
begin
for i := 1 to 28do
begin
for n := 1 to 21do
begin
JG[i,n]:=0;
end;
end;
ZD:=TStringList.Create;
ZD.Add('C');
ZD.Add('D');ZD.Add('E');ZD.Add('F');ZD.Add('G');ZD.Add('H');ZD.Add('I');
ZD.Add('J');ZD.Add('K');ZD.Add('L');ZD.Add('M');ZD.Add('N');ZD.Add('O');
ZD.Add('P');ZD.Add('Q');ZD.Add('R');ZD.Add('S');ZD.Add('T');ZD.Add('U');
ZD.Add('V');ZD.Add('W');ZD.Add('X');
//**************
if pos('JG',ListV.Name)>0 then
begin
for iloop := 0 to ListV.Items.Count-1do
begin
ListV.SetFocus;
ListV.Items[iloop].Selected:=true;
OpenTable('select * from TGB_JGBPB where BH0= '+QuotedStr(ListV.Items.Item[iloop].SubItems[0])+' order by XM0',AQ);
for i := 1 to AQ.RecordCountdo
begin
ProBar.Position:=0;
ProBar.Max:=AQ.RecordCount;
for n := 1 to ZD.Count-1do
begin
JG[i,n]:=JG[i,n]+KToZero(AQ.fieldbyname(ZD.Strings[n]).AsString);
end;
Application.ProcessMessages;
ProBar.Position:=i;
AQ.Next;
end;
end;
end;
//************
if pos('SY',ListV.Name)>0 then
begin
for iloop := 0 to ListV.Items.Count-1do
begin
OpenTable('select * from TGB_SYBPB where BH0= '+QuotedStr(ListV.Items.Item[1].SubItems[0])+' order by XM0 ',AQ);
for i := 1 to AQ.RecordCountdo
begin
ProBar.Position:=0;
ProBar.Max:=AQ.RecordCount;
for n := 0 to ZD.Count-2do
begin
SY[i,n]:=SY[i,n]+KToZero(AQ.fieldbyname(ZD.Strings[n]).AsString);
end;
Application.ProcessMessages;
ProBar.Position:=i;
AQ.Next;
end;
end;
end;
end;
function HZThread.OpenTable(StrSQL: String;
AQ: TADOQuery): Integer;
begin
with AQdo
begin
Close;
SQL.Clear;
SQL.Add(StrSQL);
Open;
Result:=RecordCount
end;
end;
procedure HZThread.Execute;
begin
repeat
DateHZ;
until Terminated;
{ Place thread code here }
end;
function HZThread.KToZero(K: String): Extended;
begin
if TryStrToFloat(K,Result) then
else
Result:=0;
end;
constructor HZThread.Create(LVName: TListView;
AQuery: TADOQuery;
PBarName: TProgressBar);
begin
ListV:=LVName;
AQ:= AQuery;
ProBar:=PBarName;
Inherited Create(True);

end;
end.
 
才学多线程。。下面这个不知道错在那里。。请教各位大侠。。。
hehe,你把这么一大段代码贴在这里,又不说出了什么问题,消磨别人时间么?
 
你的线程设计有很多的问题,比如VCL的同步,但是我想引起错误的最大的问题在于
ZD := TStringList.Create
在线程体中只创建TStringList对象而没有释放,很快你的内存就被耗光了,所以操作系统就终止你的操作了
例外既然使用了ProcessMessage,就没有必要使用多线程实现
 
TO
muhx
ZD没释放是个问题但最终问题不是这个引起的。。
另外为什么用了ProcessMessage,就没有必要使用多线程实现呢??
请教。。
 
你这段代码无非是为了在查询数据库的同时界面还要响应,避免造成假死机
所以使用了Application.ProcessMessage来让主线程的消息能够得到及时的响应
所以不使用线程已经能够达到这个目的
使用线程,那么可以认为主线程和你的数据库操作线程同时运行,你就没有必要再显式得使用了Application.ProcessMessage让主线程响应消息了
Delphi线程中最主要的一点是涉及到VCL时的同步问题,你如果使用想到创建线程就会看到Delphi的提示
{ 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 ddd.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
}
所以你涉及到界面操作的时候要使用Synchronize来进行VCL的同步
 
TO
muhx
这代码实现的功能不是你说的那样。。。
调用的时候是这样的
HZTh:=HZThread.Create(ListV_JG,AQ_JG,PBar_JG);
HZTh:=HZThread.Create(ListV_SY,AQ_SY,PBar_SY);
是根据两个ListView里内容处理数据库里的数据。。。
 
后退
顶部