【发布时间】:2011-08-11 05:37:55
【问题描述】:
有两种形式。
Form2 不是自动创建的。
Form2:=TForm2.Create(Application);
Form2.Show;
如果在任何表格中执行Sleep(10000);,那么另一个表格将被冻结。如何防止这种行为?
我的问题:一个大文本文件 (3 Mb) 被连续分配 (Lines.Assign) 到文本编辑器中,因此表单被冻结。
我可以使用另一个未冻结的表单(不是模态)来显示进度条(样式是 pbstMarquee)吗?
【问题讨论】:
-
Sleep() 函数的定义是“冻结此线程”,如果您冻结主线程,则冻结所有表单,因为它们都只能在主线程中工作。听起来您需要了解消息泵在 win32 应用程序设计中的重要性。 en.wikipedia.org/wiki/Event_loop
-
有曾经真正的理由调用睡眠吗?
-
在前台线程中?不,即使在后台线程中,WaitForSingleObject 也会更好。我认为 OP 正在使用 Sleep() 来模拟他的 3mb 文本文件的加载时间。
-
最大传真;如果您要加载 3mb 的文件,请尝试使用 SynEdit 而不是 TMemo。
-
@Nick Hodges - 当然。例如,许多协议需要延迟。 WFSO 需要创建一个同步对象来等待,而这种复杂性的唯一理由是 Delphi 中近乎绝望的线程支持,(是的,我知道,其他语言同样糟糕或好不了多少),这迫使开发人员努力终止在应用程序上释放表单之前的后台线程。关闭。
标签: multithreading forms delphi