请问你能帮帮我吗。我正在编写一个组件(类似于 TListView),在我的组件中我一个一个地执行 3 个过程:
procedure findFiles(Path:String); // using FindFirst, FindNext
procedure ArrangeItems; // assigns Item Position
procedure SetIcons; // Loads Images, resizes, adds to ImageList
我无法理解如何让我的组件使用线程来执行所有这些过程,至少是第一个(findFiles)。我尝试了不同的方法,但没有任何结果。
这是我所拥有的内容(只是一个基本示例)。
type
TSearchThread = class(TThread)
private
SIView: TSIView;
protected
procedure Execute; override;
procedure DoSearch;
public
constructor Create(fSIView: TSIView);
end;
constructor TSearchThread.Create(fSIView: TSIView);
begin
SIView := fSIView;
FreeOnTerminate := True;
inherited Create(False);
Priority := tpLower;
end;
procedure TSearchThread.Execute;
begin
inherited;
Synchronize(DoSearch);
end;
first I tried to perform
SIView.findFiles('C:\');
ArrangeItems;
然后才执行线程来设置适当的图标(SetIcons):
procedure TSearchThread.DoSearch;
begin
SetIcons;
end;
它工作但有错误:有时我的组件不是为所有项目创建图标,有时某些项目的图标完全填充为黑色,有时我根本没有图标;
然后我决定在线程中执行所有 3 个程序:
procedure TSearchThread.DoSearch;
begin
SIView.findFiles('C:\');
ArrangeItems;
SetIcons;
end;
结果,我在创建图标时遇到了同样的错误,而不是在指定的文件夹中搜索,而是在我的应用程序所在的文件夹中搜索。
为了让您更了解我,我正在尝试编写一个具有多个选项卡的文件管理器,据我所知,我需要使用 Threads 以便应用程序在处理多个选项卡时不会冻结。
你能帮我理解如何安排我的代码吗?!!!!!!也许你可以举个例子,因为关于线程的文档并不多。
你好,我们又见面了。
我已经尝试过 AsyncCalls 和 OmniThreadLibrary。他们都有一个“背景”文件搜索的例子。首先,我发现 AsyncCalls 更适合我的应用程序,因为它确实做得很好。我使用 AsyncCalls 来执行我的三个过程,这正是我一直在寻找的。我还尝试使用 OmniThreadLibrary 调用我的程序,但它们似乎不是在线程中执行的。这就是为什么我更喜欢 AsyncCalls,但我有一个问题,如何在 IAsyncCall 运行时停止它?我的意思是,例如,正如我之前提到的,我的应用程序是多选项卡,如果用户打开 3 个选项卡并在每个选项卡上执行文件搜索,那么如何停止在第二个选项卡上进行文件搜索?
为了让您更清楚地了解我想要做什么,这里有一个草图:
一个表格有3个TMemo,3个TButton
var
a1, a2, a3: IAsyncCall;
procedure TForm1.Search(Path:String; MEMO:TMemo);
begin
/////// Finds files and adds to MEMO
end;
除了指向不同的 TMemo(Memo1、Memo2、Memo3)之外,所有三个按钮的作用都相同;
procedure TForm1.Button1Click(Sender: TObject);
procedure DoSearch;
begin
Search('C:\', Memo1);
end;
begin
a1 := LocalAsyncCall(@DoSearch);
while AsyncMultiSync([a1], True, 0) = WAIT_TIMEOUT do
Application.ProcessMessages;
end;
因此,如果我单击所有三个按钮,我将运行 3 个 IAsyncCall。如何在它们仍在运行时停止它们?