如何在Delphi中等待和终止TThread(完成后通知用户)

时间:2013-07-12 20:57:29

标签: multithreading delphi notifications delphi-6

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

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

在没有剩余文件之前,不能销毁工作线程。 在线程内部,数据被加载到ClientDataSet,最后应用于数据库。

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

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

1 个答案:

答案 0 :(得分:7)

  

我应该创建并销毁每个文件的线程吗?

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

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

  

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

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

  

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

是。除非线程在终止之前处理多个文件,否则线程可以在每个文件之间手动发送通知。

  

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

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