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

EPr*_*und -2 delphi notifications multithreading delphi-6

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

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

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

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

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

Rem*_*eau 7

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

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

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

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

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

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

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

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

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