在线程中,如何中断我的检测代码,而不会造成资源泄漏!(5分)

  • 主题发起人 主题发起人 fullstrong
  • 开始时间 开始时间
F

fullstrong

Unregistered / Unconfirmed
GUEST, unregistred user!
我在线程中用自己编写的控件(myemail)来检测邮箱地址,可以通过myemail.Abort
方法来中断线程中的myemail.checkemail检测,由于检测邮箱的所花时间不确定,有时只
要几秒钟,有时由于各种原因可能要花几分钟,我想在当检测所花时间太长的时候,通过
手工运用myemail.Abort方法来中断myemail.checkemail的检测,然后正常的退出检测线程
而不是强行中断线程。
我在这里想问的是:
我该如何运用myemail.Abort方法来中断线程中myemail.checkemail的检测,该如何做?

procedure TTaskThread.Execute;
begin
while not Terminateddo
begin
myemail.checkemail('leser@163.net');
//我的检测代码
end;
end;
 
分是少了一点,但请大家关注一下。
 
如果没人答,我希望 Huzzz 能出来帮我。
 
1、保证你的类实例不会被重入(多于一个线程同时执行同一个实例的CheckEMail)
2、将CheckEMail中的局部堆栈变量转移到类定义中成为Private域变量
3、所有在CheckEMail中要分配的资源(内存、句柄等),独立在另一个Initialize过程中,
在调用CheckEMail之前执行
4、Abort过程可以实施具体的中断措施(如强行断开CheckEmail的Socket连接使得
CheckEmail中的Socket操作产生一个错误代码或者异常,从而导致实际的中断而跳出)
5、CheckEMail之后使用一个相对与Initialize的独立UnInitialize过程来撤销所有的资源
分配。
相当于把CheckEMail过程做成一个事务用Initialize/UnInitialize封装起来,Abort被归
入事务内操作。
Neptune @
 
eDRIVE:
你可能还没有看清楚我的要求,关于控件的做法我也清楚,我现在想知道的是我
在线程中该如何运用myemail.Abort方法来中断线程中myemail.checkemail的检测,
该如何做?
 
参照第4步
你的CheckEMail一定依靠Socket连接来进行,如果无法在一个可以忍耐的时间里完成Check
则肯定是阻塞在Socket的读写语句。如果在外部的线程强制关闭这个Socket连接(必须有
这个连接的Handle)则阻塞一定会消除并返回错误信息,当然中断检测过程了
Neptune @
 
问题自己解决了。
 
后退
顶部