一个线程问题

lendlice 2004-04-02 05:45:46

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

可能是线程问题,因为我用了第三方控件.
请指教.
...全文
40 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
efsnake 2004-04-02
  • 打赏
  • 举报
回复
给你写个简单的事例:

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;

如果需要的话留个邮箱,我有空写个完整的示例给你!
efsnake 2004-04-02
  • 打赏
  • 举报
回复
可以解决的。你的问题是单线程和多线程的问题!你的ProgressForm和MainForm是在同一个线程中运行,ProgressForm.ShowModal后线程就在这里阻塞了,必须要等ProgressForm返回了后才继续进行。你应该用BeginThread新起一个线程,把你的循环代码放到新起的线程中运行,并且在新线程中使用回调函数来操作ProgressBar,这样就可以达到你的目的了。
你要写一个线程函数来执行你的循环,一个回调函数来操作你的ProgressBar,把线程函数地址和回调函数地址传递给BeginThread函数。回调函数的地址会作为线程函数的参数传递给线程函数,但是要注意在传递过程中回调函数的地址被转化为一个无类型指针,你必须要在线程函数中把他转化为指向你的回调函数的指针。或者简单点,不需要写回调函数,你把ProgressBar对象的指针传递过去就可以操作了,但是传递中还是被转化为无类型指针。
详细的你可以去看下BeginThread函数的帮助。
广州接入 2004-04-02
  • 打赏
  • 举报
回复
可以,不过你的程序结构得改一下。
你先启动线程,然后显示进度条。在线程中不要直接引用进度条,而通过发消息进行。
nnfish 2004-04-02
  • 打赏
  • 举报
回复
帮你顶
lendlice 2004-04-02
  • 打赏
  • 举报
回复
我想用showmodal,并且在不关闭ProgressForm的情况,让循环一直进行下去直到结束,可以做到吗?

因为用show的话会出现控件(所用的第三方控件)忙的错误.
lovestl 2004-04-02
  • 打赏
  • 举报
回复
ProgressForm.showmodal---->问题在这

模式对话框当然会阻止消息的传递啊,用Show方法才行。
:)
lendlice 2004-04-02
  • 打赏
  • 举报
回复
代码简示:

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;
gzhk 2004-04-02
  • 打赏
  • 举报
回复
楼主说的有点太含糊了.
我猜你是不是在线程结束时没有将进度窗体的关闭事件没有关闭???
醉马不肖 2004-04-02
  • 打赏
  • 举报
回复
不只所云

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧