我编写了一个应用程序(使用Delphi 2009),允许用户选择一系列可以在多个不同系统上运行的查询。为了允许并发运行查询,每个查询都在自己的线程中运行,使用TADOQuery对象。这一切都很好。
我的问题是,当我尝试关闭应用程序时,如果仍有查询在运行(因此存在单独的线程),就会出现问题。当我创建每个线程时,我将线程的THandle记录在数组中。当我尝试关闭应用程序时,如果任何线程仍在运行,则检索线程的句柄并将其传递给TerminateThread,理论上应该终止线程并允许应用程序关闭。但是,这并没有发生。主窗体的onClose事件被触发,看起来应用程序正在关闭,但进程仍然处于活动状态,我的Delphi界面似乎仍在运行(即“运行”按钮变灰,调试视图处于活动状态等)。除非我手动结束进程(在Delphi中按Ctrl-F2或通过任务管理器),否则我无法控制Delphi。
我使用TerminateThread是因为查询可能需要很长时间才能运行(在处理数百万条记录的情况下可能需要几分钟,在最终用户环境中完全可能),而当它正在运行时,除非我弄错了,否则线程将无法检查Terminated属性,因此除非查询已返回,否则线程将无法在Terminated属性设置为True时结束自身,因此我无法以通常的方式(即通过检查Terminated属性)终止线程。也许用户希望在运行大型查询时退出应用程序,在这种情况下,我需要应用程序立即结束(即所有运行中的线程立即终止),而不是强制它们等待所有查询完成运行,因此TerminateThread是理想的,但实际上并没有终止线程!
有人能帮忙吗?有人知道为什么TerminateThread不能正常工作吗?有人可以建议任何方法来立即终止运行大型ADO查询的线程吗?
我的问题是,当我尝试关闭应用程序时,如果仍有查询在运行(因此存在单独的线程),就会出现问题。当我创建每个线程时,我将线程的THandle记录在数组中。当我尝试关闭应用程序时,如果任何线程仍在运行,则检索线程的句柄并将其传递给TerminateThread,理论上应该终止线程并允许应用程序关闭。但是,这并没有发生。主窗体的onClose事件被触发,看起来应用程序正在关闭,但进程仍然处于活动状态,我的Delphi界面似乎仍在运行(即“运行”按钮变灰,调试视图处于活动状态等)。除非我手动结束进程(在Delphi中按Ctrl-F2或通过任务管理器),否则我无法控制Delphi。
我使用TerminateThread是因为查询可能需要很长时间才能运行(在处理数百万条记录的情况下可能需要几分钟,在最终用户环境中完全可能),而当它正在运行时,除非我弄错了,否则线程将无法检查Terminated属性,因此除非查询已返回,否则线程将无法在Terminated属性设置为True时结束自身,因此我无法以通常的方式(即通过检查Terminated属性)终止线程。也许用户希望在运行大型查询时退出应用程序,在这种情况下,我需要应用程序立即结束(即所有运行中的线程立即终止),而不是强制它们等待所有查询完成运行,因此TerminateThread是理想的,但实际上并没有终止线程!
有人能帮忙吗?有人知道为什么TerminateThread不能正常工作吗?有人可以建议任何方法来立即终止运行大型ADO查询的线程吗?