一个奇怪的问题:cannot terminate an externally created thread

秋天之落叶 2024-05-16 09:16:34

win7/win10/win10+delphi12.1+ehlib+xls,前两台单位的机子,后一台家里的机子。

同样的版本安装,单位的win7和家里的win10,运行同样的项目,一切正常;单位的win10(刚装机)运行同样的项目却出现这个提示,但并不影响正常的运行和退出。delphi10.3/10.4也没有问题。

仔细看了看代码,就登录时用了一个线程

  t := TMyThread.Create(False); 
  h := t.Handle;

  repeat 
    w := MsgWaitForMultipleObjects(1, h, False, INFINITE, QS_ALLINPUT);
    Application.ProcessMessages;
  until (w = WAIT_OBJECT_0) or (w = WAIT_FAILED);

  try
  ......
  if ado.FieldByName('状态').IsNull then
     begin          
       t.Terminate;
       exit;
     end;        
  finally
    t.Terminate;
    t := nil;  
  end;

是代码漏洞,还是安装的问题,大佬给看看有什么问题吗?

...全文
419 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋天之落叶 2024-05-17
  • 打赏
  • 举报
回复

总结
根据BlueStorm的提示,确实线程自动Terminate,检查代码发现已经设置了FreeOnTerminate := True。
所以,要不去掉Terminate,要不去掉FreeOnTerminate := True,代码运行正常。
不过,还是很奇怪,同样的代码,为什么只有一台机子的delphi12.1的代码运行出现这个问题,本机的delphi10.3/10.4都运行正常,而且其他机子的10.3/10.4/12.1均运行正常,太奇怪了。

秋天之落叶 2024-05-17
  • 举报
回复
@秋天之落叶 并且,我测试了一下12.1的安装版和lite版,本机上均出现这样的错误提示。
BlueStorm 2024-05-17
  • 打赏
  • 举报
回复

也有可能是,你Terminate线程的时候,线程早就FreeOnTeminate了

秋天之落叶 2024-05-17
  • 举报
回复
@BlueStorm 您说对了,我去掉 t.Terminate后不再提示错误。 但是我奇怪的是,为什么只有一台机子的12.1版本有这个问题,其他机子上或其他版本没有这个问题?难道是机器的问题? 没办法,我加一个判断吧。
BlueStorm 2024-05-16
  • 打赏
  • 举报
回复

这个线程的FExternalThread被设成True了, Terminate这个线程就会报这个错误, 你跟踪一下FExternalThread什么时候从false变成true.

秋天之落叶 2024-05-16
  • 举报
回复
@BlueStorm 我试一下。奇怪的是,为什么别的版本和别的机器不报这个错误?
秋天之落叶 2024-05-17
  • 举报
回复
@BlueStorm 测试了一下,错误时,提示线程无法访问,没看到true值。
  • 打赏
  • 举报
回复

没看出来这个线程有什么用

秋天之落叶 2024-05-16
  • 举报
回复
@日立奔腾浪潮微软松下联想 登陆的时候可能会因为服务器或其他原因,等待很久,这个线程就是为了中途能直接退出。
BlueStorm 2024-05-17
  • 举报
回复
@秋天之落叶 不需要使用线程, 你应该改用先Telnet ip port的方法来测试一下服务器和服务是否正常在线, Telnet组件可设置timeout参数, 一秒或两秒就够了. 确定服务在线后, 再login。 Telnet组件的使用是非常简单的.
秋天之落叶 2024-05-17
  • 举报
回复
@BlueStorm 当时做到这里正好也想实践一下线程,就做了一个最简单的。我试一试telnet。

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧