我设计了一个主窗体MainForm和一个显示进度的窗体ProgressForm.
程序中用一个循环按顺序执行多个任务的时候,比如传输多个文件,当一个文件传完了以后程序便暂停了,只有关掉进度窗口以后循环才继续,请问为什么会这样?怎么可以在不关掉进度窗口的情况下让循环一直进行下去呢?可能是线程问题,因为我用了第三方控件.
请指教.

解决方案 »

  1.   

    代码简示:type TTask = class(TObject)
       ....
       procedure proc1();
      end;procedure TMainForm.ExecuteTasks(pTasks: array of TTask);
    var
     i: integer;
    begin
      for i:=Low(pTasks) to High(pTasks) do
      begin
          pTasks[i].proc1;    if not assigned(ProgressForm) then
          ProgressForm := TProgressForm.create(self);
        ProgressForm.showmodal;
      end;
    end;
      

  2.   

    ProgressForm.showmodal---->问题在这模式对话框当然会阻止消息的传递啊,用Show方法才行。
    :)
      

  3.   

    我想用showmodal,并且在不关闭ProgressForm的情况,让循环一直进行下去直到结束,可以做到吗?因为用show的话会出现控件(所用的第三方控件)忙的错误.
      

  4.   

    可以解决的。你的问题是单线程和多线程的问题!你的ProgressForm和MainForm是在同一个线程中运行,ProgressForm.ShowModal后线程就在这里阻塞了,必须要等ProgressForm返回了后才继续进行。你应该用BeginThread新起一个线程,把你的循环代码放到新起的线程中运行,并且在新线程中使用回调函数来操作ProgressBar,这样就可以达到你的目的了。
    你要写一个线程函数来执行你的循环,一个回调函数来操作你的ProgressBar,把线程函数地址和回调函数地址传递给BeginThread函数。回调函数的地址会作为线程函数的参数传递给线程函数,但是要注意在传递过程中回调函数的地址被转化为一个无类型指针,你必须要在线程函数中把他转化为指向你的回调函数的指针。或者简单点,不需要写回调函数,你把ProgressBar对象的指针传递过去就可以操作了,但是传递中还是被转化为无类型指针。
    详细的你可以去看下BeginThread函数的帮助。
      

  5.   

    给你写个简单的事例:function MyThreadFunc(Para: Pointer): integer;  //注意:线程函数的形式是固定的。
    var
      pgb: TProgressBar;
    begin
      pgb:= Para; 
      //现在pgb就是指向一个ProgressBar对象的指针,你只要把你要操作的ProgressBar对象
      //的指针作为Para参数传递过来就可以了。
      pgb.Position:= 0;end;procedure btnStartClick(Sender: TObject);
    var
      P1, P2: LongWord;
      Para: Pointer;
    begin
      //在这里将你要操作的ProgressBar对象的指针给Para。
      Para:= ............;
      BeginThread(nil,0,MyThreadFunc,Para,P1,P2);
      //此时新的线程已经开始运行,当中运行的代码就是你的线程函数(MyThreadFunc)中的代
      //码。BeginThread新起线程后立即就返回了,所以这里以后的代码仍然继续运行。
    end;如果需要的话留个邮箱,我有空写个完整的示例给你!