事情是这样的,写了一个小程序,功能就是获取磁盘的分区、总空间、剩余空间。
在本机由于分区少运行的蛮不错,但在朋友机器上,他的分区是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;仅仅就上面这点代码,运行起来也没反映,好像也需要过半分钟才能显示出来。实在是郁闷啊。

解决方案 »

  1.   

    磁盘的问题不清楚不过所有对vcl组件的操作都应该放到主线程里去,你在子线程操作SEM_MainForm.SEM_FSO_Drives是不允许的.
      

  2.   

    skylkj你好
    那如果需要在子线程里面读取列表,那按你的思路应该怎么设计呢
      

  3.   

    delphi自己有线程类TThread,其中有Synchronize方法,用于将一些操作提交给主线程执行比如:  Tmythread = class(TThread)
        private
          procedure main_thread_deal();
        protected
          procedure Execute();override;
        end;然后在Execute里面执行Synchronize(main_thread_deal);