请大家帮一下...我刚学线程(20分)

  • 主题发起人 主题发起人 SuKiDelphi
  • 开始时间 开始时间
S

SuKiDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
想用线程来找指定的文件扩展名........

部分代码:
var
MediaEXT : TStringList;
StrA : String;
IntA : Integer;
// 全局
MediaEXT := TStringList.Create;
with MediaEXTdo
begin
Add('.rm');
// RealVideo
Add('.rmvb');
..............
end;

procedure MyTipInfo (Str : String;
Log : Byte);
begin
with form1do
begin
Label_TI.Visible := False;
if Timer_TI.Enabled = False then
begin
Timer_TI.Enabled :=True;
Label_TI.Caption := Str;
Label_TI.Left := (ClientWidth - Label_TI.Width) Div 2;
Timer_TI.Tag := Log;
end
else
begin
Label_TI.Caption := Str;
// Label_TI.Caption + Str;
Label_TI.Left := (ClientWidth - Label_TI.Width) Div 2;
//if Timer_TI.Tag < 30 then
Timer_TI.Tag := Log;
end;
Label_TI.Visible := True;
end;
end;

procedure GDAF(Dir : String);
//GetDirAllFile
var
Rec : TSearchRec;
f : Integer;
// found
ListItem : TListItem;
begin
if Dir[Length(Dir)] <> '/' then
Dir := Dir + '/';
f := Sysutils.FindFirst(Dir + '*.*', faAnyFile, Rec);

while f = 0do
begin
if MediaEXT.IndexOf(LowerCase(ExtractFileExt(Rec.Name))) <> -1 then
begin
with form1.LV_PL.Itemsdo
begin
Inc(IntA);
begin
Update;
ListItem :=Add;
ListItem.Caption := ChangeFileExt(Rec.Name, '');
ListItem.SubItems.Add(Dir + Rec.Name);
ListItem.SubItems.Add('');
EndUpdate;
end;
end;

if (Rec.Attr and faDirectory > 0) and (Rec.Name[1] <> '.') then
GDAF(Dir + Rec.Name);
f := Sysutils.FindNext(Rec);
end;

Sysutils.FindClose(Rec);
MyTipInfo('已识别电影文件:' + IntToStr(IntA) + '个', 1);
// 这里有问题..如果一个文件夹里有多个文件夹时....这里显示的文件数...又重新开始计了.
end;

//------------------------------------------------------------------------------
function MyFindFile(P : Pointer) : LongInt;
stdcall;
// 线程
begin
IntA := 0;
MyTipInfo('正在找查文件......', 8);
GDAF(StrA);
// 我不知如何在线程中传递参数..所以才这样做....
// 在这个线程中....不知 GDAF(StrA);
几时才会结束....
StrA:='';
end;

procedure ChechIt;
// 在上面的线程中....不知 GDAF(StrA);
几时才会结束....
begin
if form1.Label_TI.Caption = '我的软件' then
begin
KillTimer(form1.Handle, 1);
if IntA <> 0 then
MyTipInfo('已完成识别电影文件', 1)
else
MyTipInfo('“没有”或“无法识别”的文件格式', 8);
IntA:=0;
end;
end;

procedure form1.FormCreate(Sender: TObject);
begun
Label_TI.Caption = '我的软件'
end;

调用
if Msg.message = WM_DROPFILES then
begin
I := DragQueryFile(Msg.wParam, $FFFFFFFF, nil, 0);
for I := 0 to I- 1do
begin
DragQueryFile(Msg.wParam, I, P, 255);
if not DirectoryExists(P) then
begin
if MediaEXT.IndexOf(LowerCase(ExtractFileExt(P))) <> -1 then
begin
ListItem :=LV_PL.Items.Add;
ListItem.Caption :=ChangeFileExt(ExtractFileName(StrPas(P)), '');
ListItem.SubItems.Add(P);
ListItem.SubItems.Add('');
end;
end
else
begin
StrA := P;
FFThread := CreateThread(nil, 0, @MyFindFile, nil, 0, TId);

SetTimer(form1.Handle, 1, 1000, @ChechIt);

还有..我要用线程重复做相同的事..下的的线程....那一个比较好()
function MyThread(P : Pointer) : LongInt;
stdcall;
var
BooA : Boolean;
begin
BooA:=False;
repeat
...................
Sleep(500);
until BooA;
Result:=0;
end;


function MyThread(P : Pointer) : LongInt;
stdcall;
begin
while WaitForSingleObject(HpThread, 500)=WAIT_TIMEOUTdo
begin
................
end;
end;
 
第一个就可以了
第二个是用来协调多线程同步的
你这个只创建了一个线程,只是隔段时间执行一次
另外:我觉得用timer控件就可以实现了
 
找到的文件可以放在TList里,如果有子目录可以递归查找。
 
我想在找查文件时..显示找到的文件....用户可以在找查文件时在我的软件中还可操作其它的操作.....
function MyFindFile(P : Pointer) : LongInt;
stdcall;
// 线程
begin
IntA := 0;
MyTipInfo('正在找查文件......', 8);
GDAF(StrA);
// 我不知如何在线程中传递参数..所以才这样做....
// 在这个线程中....不知 GDAF(StrA);
几时才会结束....
StrA:='';
end;

有什么方法知这个线程(MyFindFile)已结束了(完成找查文件)
 
后退
顶部