Delphi - 创建一个在自己的进程中运行的控件

时间:2011-03-19 23:42:47

标签: multithreading delphi vcl tform

HI

我有一个使用专有数据集访问数据库的控件。该数据库是旧的ISAM基础数据库。

控件使用后台线程使用专有数据集查询数据库。

表单上会有几个这样的控件,每个控件都使用自己的线程来访问数据,因为它们都需要同时加载。

专有数据集通过显示VCL TForm来处理并发性,通知用户正在打开的表被另一个用户锁定,并且数据集正在等待锁被释放。

表单上有一个取消按钮,允许用户取消锁定等待。

问题:

当在线程中使用专有数据集时,如果显示锁定等待表单,应用程序将崩溃,挂起或发出错误。我怀疑这与VCL不是线程安全有关。

我已经通过同步Dataset.Open解决了这个问题,但是这会占用主线程,直到dataset.open返回,这可能需要相当长的时间,具体取决于查询的复杂性。

我已经显示了一个模态进度条,让用户知道它发生了什么,但我不喜欢这个想法,因为用户将等待进度条完成。

专有数据集代码被编译到主应用程序中,即它不存储在单独的DLL中。在开发过程的这个阶段,我们不允许更改锁定的工作方式或是否显示表单,因为我们太接近于发布。

理想情况下,我想让Dataset.open在控制线程中运行,而不是使用主线程,但这似乎不太可行。

其他人可以推荐一个解决方案吗?请。

2 个答案:

答案 0 :(得分:1)

光纤不会对您有所帮助,因为它们仅在Windows API中用于帮助轻松移植使用协作式多任务处理编写的旧代码。光纤基本上是一种协同例程,它们都在同一个进程中执行,有自己的堆栈空间,它们之间的切换由用户代码控制,而不是由操作系统控制。这意味着它们之间的切换只能在安全的时候进行,因此不会出现同步问题。 OTOH意味着只有一根光纤可以同时在一个线程内运行,因此使用带有阻塞代码的光纤具有与在一个线程内调用阻塞代码相同的特性 - 应用程序变得无响应。

您可以将纤维与多个螺纹一起使用,但这可能是危险的,并且与单独使用螺纹相比不会带来任何好处。

我在VCL应用程序中成功使用了光纤,但仅用于特定目的。如果你想处理可能阻塞的代码,请忘记它们。

至于您的问题 - 您应该创建一个仅用于显示目的的控件,它使用标准的进程间通信机制与访问您的数据库的另一个进程交换数据。

答案 1 :(得分:0)

COM对象可以在进程外模式下运行。可能在delphi中使用它们会更容易,然后是另一个IPC机制。