线程释放的问题,请指教!! 我创建了一个线程后,未执行完时想释放掉它重新创建新的线程。使用terminate方法后,程序还是去执行线程的相关代码。是否还有其他更好的方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是不是没有在线程运行中判断Terminated属性呀? To pazee(耙子)查询窗口部分代码:... private ThreadList:Tlist;...var RefThread:TrefreshThread;...implementation...procedure Timg_formSearch.BitBtn1Click(Sender: TObject);var s:string;begin with CDSExec do try Close; CommandText := 'select * from img_manageinfo_main'; open; cds.Close; cds.CommandText:=CDSExec.CommandText; cds.open; if IsEmpty then Application.MessageBox('没有查到任何记录!', '', MB_ICONWARNING + MB_OK); except on E: Exception do begin Application.MessageBox('查询因错误中止!', '', MB_ICONINFORMATION + MB_OK); exit; end; end; if CDS.RecordCount>0 then begin while ThreadList.count>0 do begin TrefreshThread(ThreadList[ThreadList.count-1]).terminate; ThreadList.Delete(ThreadList.Count-1); end; listview1.Clear; img_show.Clear; ThreadList.Add(TrefreshThread.Create(CDS,listview1,img_show)); end;end;线程单元代码:unit RefreshThread;interfaceuses Classes,ComCtrls,Graphics,Dialogs,dbclient,controls,sysUtils,Forms;type TRefreshThread = class(TThread) private { Private declarations } ListItem:TListItem; bmp:tbitmap; imgindex:integer; tempfilepath:string; CDS:Tclientdataset; ListViewThr:TlistView; img_showThr:TImagelist; procedure getpath; protected procedure Execute; override; public constructor Create(C:TclientDataset;L:TListview;I:TimageList);virtual; end;implementationuses img_search, pub;constructor TRefreshThread.Create(C: TClientDataset; L: TListview;i:TimageList);begin CDS:=C; CDS.First; ListViewThr:=L; img_showThr:=I; FreeOnTerminate:=True; inherited Create(false);end;procedure TRefreshThread.Execute;begin inherited; // listview.Clear ; //img_show.Clear ; while not CDS.Eof do begin try if Terminated then break; bmp:=tbitmap.Create ; Synchronize(getpath); bmp.LoadFromFile(tempfilepath); Stretch(bmp); imgindex:=img_showThr.Add(bmp, nil); ListItem:=listviewThr.Items.Add;ListItem.Caption:=CDS.FieldByName('cd_sn').AsString+#13#10+CDS.FieldByName('file_name').AsString+#13#10+CDS.FieldByName('img_name').AsString ; ListItem.ImageIndex:=imgindex; bmp.Free; CDS.Next ; except bmp.LoadFromFile(ExtractFilepath(Application.ExeName)+'CUST080.BMP'); Stretch(bmp); imgindex:=img_showThr.Add(bmp, nil); ListItem:=listviewThr.Items.Add; ListItem.Caption:=CDS.FieldByName('cd_sn').AsString+#13#10+CDS.FieldByName('file_name').AsString+#13#10+CDS.FieldByName('img_name').AsString ; ListItem.ImageIndex:=imgindex; bmp.Free; CDS.Next ; end; end;end;procedure TRefreshThread.getpath;beginif (not Terminated) thentempfilepath:=Getpathico(CDS.FieldByName('Cd_sn').AsString,CDS.FieldByName('File_name').AsString);end;end.To zuoyexingchen(昨夜星尘)如上代码,我判断Terminate属性了。 delphi哪个控件可以用鼠标选中文字后右键复制文字 還是關於SQL效率的問題 ADO小问题! 请教在datamodule里用BDE的database和query,为什么append一条数据就死机?用table就可以?在线等 关于dll调用ado时初始化和善后问题,折磨我几天了。请高手帮我解决。 为什么我的打印预览只显示一条记录啊? 光盘防拷贝问题? D2007(其它版本的D没有此问题)建立的中间层服务,启动后,在客户端无法识别! 有关关键字"inherited"的请教? 关于 delphi opencv 的问题 进度的问题?? 请问Delphi的编辑框中,是不是没有自动感应的功能!
查询窗口部分代码:
... private
ThreadList:Tlist;
...var
RefThread:TrefreshThread;
...
implementation
...
procedure Timg_formSearch.BitBtn1Click(Sender: TObject);
var
s:string;
begin
with CDSExec do
try
Close;
CommandText := 'select * from img_manageinfo_main';
open;
cds.Close;
cds.CommandText:=CDSExec.CommandText;
cds.open;
if IsEmpty then Application.MessageBox('没有查到任何记录!', '', MB_ICONWARNING + MB_OK);
except
on E: Exception do
begin
Application.MessageBox('查询因错误中止!', '', MB_ICONINFORMATION + MB_OK);
exit;
end;
end;
if CDS.RecordCount>0 then
begin
while ThreadList.count>0 do
begin
TrefreshThread(ThreadList[ThreadList.count-1]).terminate;
ThreadList.Delete(ThreadList.Count-1);
end;
listview1.Clear;
img_show.Clear;
ThreadList.Add(TrefreshThread.Create(CDS,listview1,img_show));
end;
end;线程单元代码:
unit RefreshThread;interfaceuses
Classes,ComCtrls,Graphics,Dialogs,dbclient,controls,sysUtils,Forms;type
TRefreshThread = class(TThread)
private
{ Private declarations }
ListItem:TListItem;
bmp:tbitmap;
imgindex:integer;
tempfilepath:string;
CDS:Tclientdataset;
ListViewThr:TlistView;
img_showThr:TImagelist;
procedure getpath;
protected
procedure Execute; override;
public
constructor Create(C:TclientDataset;L:TListview;I:TimageList);virtual;
end;implementationuses img_search, pub;constructor TRefreshThread.Create(C: TClientDataset; L: TListview;i:TimageList);
begin CDS:=C;
CDS.First;
ListViewThr:=L;
img_showThr:=I;
FreeOnTerminate:=True;
inherited Create(false);
end;procedure TRefreshThread.Execute;begin
inherited;
// listview.Clear ;
//img_show.Clear ;
while not CDS.Eof do
begin
try
if Terminated then
break;
bmp:=tbitmap.Create ;
Synchronize(getpath);
bmp.LoadFromFile(tempfilepath);
Stretch(bmp);
imgindex:=img_showThr.Add(bmp, nil);
ListItem:=listviewThr.Items.Add;
ListItem.Caption:=CDS.FieldByName('cd_sn').AsString+#13#10+CDS.FieldByName('file_name').AsString+#13#10+CDS.FieldByName('img_name').AsString ;
ListItem.ImageIndex:=imgindex;
bmp.Free;
CDS.Next ;
except
bmp.LoadFromFile(ExtractFilepath(Application.ExeName)+'CUST080.BMP');
Stretch(bmp);
imgindex:=img_showThr.Add(bmp, nil);
ListItem:=listviewThr.Items.Add;
ListItem.Caption:=CDS.FieldByName('cd_sn').AsString+#13#10+CDS.FieldByName('file_name').AsString+#13#10+CDS.FieldByName('img_name').AsString ;
ListItem.ImageIndex:=imgindex;
bmp.Free;
CDS.Next ;
end;
end;
end;procedure TRefreshThread.getpath;
begin
if (not Terminated) then
tempfilepath:=Getpathico(CDS.FieldByName('Cd_sn').AsString,CDS.FieldByName('File_name').AsString);
end;
end.To zuoyexingchen(昨夜星尘)
如上代码,我判断Terminate属性了。