-2

如果用户提供记录在 excel 文件中的信息,那么我选择 Excel COM 来读取数据。但是,由于用户可以对 N 个文件重复该过程并且该过程可能需要一段时间,因此我决定将此例程移到一个单独的线程中。

因此,我需要您的建议来定义我该怎么做。

在没有更多剩余文件之前,无法销毁工作线程。在线程内部,数据被加载到 ClientDataSet 并最终应用于数据库。

当任务完成时,我需要以某种方式通知用户,以便他可以决定是否加载另一个文件并再次执行线程或完成工作。

如何正确销毁线程并通知用户?

4

1 回答 1

7

我应该为每个文件创建和销毁线程吗?

你可以,但这不是一个非常有效的设计。将文件放入线程安全队列,如果线程尚未运行,则启动线程,然后让线程循环通过队列util它是空的。那时,线程可以被销毁,或者只是进入睡眠状态,以防以后有更多文件排队。

如果您实现线程池,此设计还允许您并行处理多个文件。当您将文件放入队列时,如果还没有空闲线程等待使用,则启动一个新线程。当线程启动时,从队列中拉出下一个可用文件。当该线程完成时,它可以从队列中提取下一个文件,如果没有文件,则返回到池中以供以后重用。

如果是这样,如何正确销毁线程并通知用户?

当你准备好销毁一个线程时,调用它的Terminate()方法(它Execute()需要Terminated定期检查它的属性并在设置为 true 时退出),然后调用它的WaitFor()方法(或等效的,例如MsgWaitForMultipleOjects(),它允许你在等待时保持消息队列响应线程终止),然后将其从内存中释放。线程在退出后触发其OnTerminate事件,但是在事件处理程序Execute()中销毁线程是不安全的。OnTerminate如果您想在OnTerminate事件触发时销毁线程(尤其是如果您不希望线程终止,例如如果它抛出未捕获的异常),您可以向自己发布一个异步通知,例如 with PostMessage(), PostThreadMessage(),TThread.Queue()等,然后在稍后处理该通知时销毁线程。

如何设置线程在工作完成时通知用户?通过分配事件 OnTerminate?

是的。除非线程在终止之前要处理多个文件,在这种情况下,线程可以在每个文件之间手动发送通知。

最好为每个文件创建线程或创建 1 个线程并以某种方式控制每次不同文件的执行?

在资源和处理方面,创建和销毁线程对于操作系统来说并非易事,因此您应该尽可能地重用线程。在他们无事可做的时候让他们睡觉,除非他们要睡很长时间,在这种情况下你应该摧毁他们以释放他们的资源。

于 2013-07-12T22:44:15.367 回答