Multithreading 表单在单独线程中加载数据时被冻结
我使用TIdHTTP组件在一个单独的线程中从银行加载xml数据,但在此期间我的表单被冻结 有什么问题吗 我有一个主窗体和线程类,在线程类中我有一个名为loadData的方法,在thread::Execute I Synchronize(loadData)上 当点击按钮时,我创建了线程类的实例,比如testThread*t=newtestthread(false) 就这些 当我点击按钮时,主窗体冻结? 即使是分开的线也没用Multithreading 表单在单独线程中加载数据时被冻结,multithreading,http,thread-safety,c++builder,indy,Multithreading,Http,Thread Safety,C++builder,Indy,我使用TIdHTTP组件在一个单独的线程中从银行加载xml数据,但在此期间我的表单被冻结 有什么问题吗 我有一个主窗体和线程类,在线程类中我有一个名为loadData的方法,在thread::Execute I Synchronize(loadData)上 当点击按钮时,我创建了线程类的实例,比如testThread*t=newtestthread(false) 就这些 当我点击按钮时,主窗体冻结? 即使是分开的线也没用 请帮忙 Synchronize()正在主线程的上下文而不是工作线程的上下文
请帮忙
Synchronize()
正在主线程的上下文而不是工作线程的上下文中运行loadData()
方法。这就是为什么主线程在loadData()
忙时阻塞的原因。您误用了Synchronize()
,使线程变得无用。您需要在Synchronize()
之外完成大部分线程工作,然后在需要时使用Synchronize()
仅在主线程中执行小的更新,例如显示状态(即使如此,Synchronize()
也不总是最好的选择)。嗨,雷米!我是否需要简单地调用loadData()方法而不是Synchronize(loadData);对仅当需要在主线程而不是工作线程中运行代码时才使用Synchronize()
。AFAIK Synchronize用于更新VCL组件的状态,我称之为loadData();在执行事件时,网格没有显示任何内容???是的,Synchronize()
需要在需要时用于更新网格。不驱动整个loadData()
逻辑。