0

我有一个大约有 10 个窗口的 Delphi7 项目。MainWindow 在程序启动时被加载。一段时间后,MainWindow 访问项目的另一个窗口以添加 listview 项目并大约每 1-2 秒更新它们。然而,这个窗口似乎冻结了,并且在我打开它之后根本不显示列表视图。

如果我在 MainWindow 的 OnShow 过程中有以下命令,它就可以工作:

SecondWindow.Show;
SecondWindow.Close;

它可以正常工作,但似乎不专业。有什么想法可以在不显示的情况下绘制窗口吗?

编辑:代码(我使用 Indy9)

procedure TMainWindow.ServerSocketExecute(AThread: TIdPeerThread);
begin
 /....
 if Buffer = 'additem' then begin
    Window2.ListView1.Items.Add;
    Exit;
    // .....
 end;
end;

而已。我删除了 Window2 上的所有计时器,它似乎仍然冻结。如果添加了项目,或者当我第一次尝试打开第二个窗口时,主窗口会立即冻结。

4

1 回答 1

6

您的问题是您正在从主 GUI 线程之外调用 VCL 方法,即在 TMainWindow.ServerSocketExecute 中。此事件在工作线程中执行。从工作线程调用 VCL/GUI 代码完全违反游戏规则。所有 VCL 代码都必须在主 GUI 线程中执行。

因此,通过确保所有 VCL/GUI 代码在 GUI 线程中执行来解决问题。使用 TIdPeerThread.Synchronize() 方法或 TIdSync 或 TIdNotify 类来实现此目的。

感谢@Remy 提供了我不知道的细节。

于 2012-04-21T23:22:38.950 回答