【问题标题】:Form gets freezed during loading data in a seperate thread在单独的线程中加载数据期间表单被冻结
【发布时间】:2011-03-30 03:52:30
【问题描述】:

我使用 TIdHTTP 组件在单独的线程中从银行加载 xml 数据,但在那段时间我的表单被冻结...

可能是什么问题?

我有一个主窗体和线程类,在线程类中我有一个名为 loadData 的方法,在 thread::Execute i Synchronize(loadData);

当按钮被点击时,我创建了线程类的实例,例如 testThread *t=new testThread(false);

仅此而已

当我单击按钮时,主窗体冻结? 甚至单独的线程也没有帮助????

请帮忙!!!

【问题讨论】:

    标签: multithreading http thread-safety c++builder indy


    【解决方案1】:

    Synchronize() 在主线程的上下文中运行您的 loadData() 方法,而不是在工作线程的上下文中。这就是为什么你的主线程在loadData() 很忙时阻塞的原因。您滥用Synchronize(),使您的线程无用。您需要在Synchronize() 之外完成大部分线程工作,然后仅在需要时使用Synchronize() 在主线程中执行小更新,例如显示状态(即便如此,Synchronize() 并不总是最佳选择为此)。

    【讨论】:

    • 嗨雷米!我需要简单地调用 loadData() 方法而不是 Synchronize(loadData);
    • 是的。仅当您需要在主线程而不是工作线程中运行代码时才使用Synchronize()
    • AFAIK Synchronize 用于更新 VCL 组件的状态,我称之为 loadData();在 Execute 事件中,Grid 什么也没显示???
    • 是的,Synchronize() 需要在需要时用于更新您的网格。不要将整个loadData() 逻辑作为一个整体来驱动。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2014-01-15
    • 2012-08-10
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多