事情是这样的,写了一个小程序,功能就是获取磁盘的分区、总空间、剩余空间。
在本机由于分区少运行的蛮不错,但在朋友机器上,他的分区是C到Z全满了,现在问题就出现了,显示出来的速度很慢,大概要半分钟,我开始以为是他分区太多了,但发现其他具有这个功能的软件速度却非常快,很纳闷,调试了一个通宵,也没解决。后来是不获取分区空间大小的功能去掉仅仅显示分区速度才非常快,哪么我就想不通了同样是调API,为什么人家的速度哪么快,我的速度哪么慢呢,GetDiskFreeSpaceEX、DISKFREE这些API我都试了,但还是不行。
接下来就想丢到线程里面去读,代码如下
procedure TSEM_MainForm.__GetDrivesList();
var
hThread: Thandle;
ThreadID: DWord;
begin
hThread := CreateThread(nil, 0, @MyThreadFunc, nil, 0, ThreadID);
end;function MyThreadFunc(P: pointer): Longint; stdcall;
var
LIndex: Integer;
begin
//try
SEM_MainForm.SEM_FSO_Drives.Items.Clear;
for LIndex := 0 to 25 do
begin
//if Length(SEM_MainForm.TFile.GetDrivesList[LIndex].TName) > 0 then
//begin}
with SEM_MainForm.SEM_FSO_Drives.Items.Add do
begin
Caption := '111111111111';
end;
//end;
end;
//except
//end;}
end;仅仅就上面这点代码,运行起来也没反映,好像也需要过半分钟才能显示出来。实在是郁闷啊。
在本机由于分区少运行的蛮不错,但在朋友机器上,他的分区是C到Z全满了,现在问题就出现了,显示出来的速度很慢,大概要半分钟,我开始以为是他分区太多了,但发现其他具有这个功能的软件速度却非常快,很纳闷,调试了一个通宵,也没解决。后来是不获取分区空间大小的功能去掉仅仅显示分区速度才非常快,哪么我就想不通了同样是调API,为什么人家的速度哪么快,我的速度哪么慢呢,GetDiskFreeSpaceEX、DISKFREE这些API我都试了,但还是不行。
接下来就想丢到线程里面去读,代码如下
procedure TSEM_MainForm.__GetDrivesList();
var
hThread: Thandle;
ThreadID: DWord;
begin
hThread := CreateThread(nil, 0, @MyThreadFunc, nil, 0, ThreadID);
end;function MyThreadFunc(P: pointer): Longint; stdcall;
var
LIndex: Integer;
begin
//try
SEM_MainForm.SEM_FSO_Drives.Items.Clear;
for LIndex := 0 to 25 do
begin
//if Length(SEM_MainForm.TFile.GetDrivesList[LIndex].TName) > 0 then
//begin}
with SEM_MainForm.SEM_FSO_Drives.Items.Add do
begin
Caption := '111111111111';
end;
//end;
end;
//except
//end;}
end;仅仅就上面这点代码,运行起来也没反映,好像也需要过半分钟才能显示出来。实在是郁闷啊。
那如果需要在子线程里面读取列表,那按你的思路应该怎么设计呢
private
procedure main_thread_deal();
protected
procedure Execute();override;
end;然后在Execute里面执行Synchronize(main_thread_deal);