16得票2回答
一个正确的销毁TThread对象的方法

这个问题可能看起来很琐碎,但我希望你不要忽视它。 在销毁TThread对象之前,通常需要等待调用TThread.Execute()方法的线程结束,只有这样我们才能确定在类的析构函数中销毁的对象不再被访问。因此,需要调用Terminate来设置Terminated标志,让线程检查是否退出,然后调...

16得票4回答
我应该用哪些Delphi代码替换我的调用已弃用的TThread方法Suspend?

这个问题以前被问过,但是没有得到完整的答案。这与所谓的“致命线程模型!”有关。 我需要用一些安全的东西替换这个调用TThread.Suspend的方法,该方法在终止或恢复时返回: procedure TMyThread.Execute; begin while (not Termina...

15得票1回答
使用TThread.Resume有什么问题?

很久以前,当我开始在Delphi中使用线程时,我让线程通过在构造函数末尾调用TThread.Resume来启动自己,并且仍然这样做,就像这样: constructor TMyThread.Create(const ASomeParam: String); begin inherited ...

13得票4回答
Delphi单元测试一个FreeOnTerminate = True的TThread

当FreeOnTerminate = True时,编写Delphi DUnit测试TThread派生类的最佳方法是什么? TThread派生类返回一个引用,我需要进行测试,但我无法弄清楚如何在测试中等待线程完成...unit uThreadTests; interface uses C...

13得票5回答
如何使用最少的资源实现定期检查某些内容的线程?

我希望有一个后台线程,每隔一定时间(例如5秒)检查与某个服务器的连接状态。 我不知道是否有一个良好的“设计模式”来实现此功能?如果我没记错的话,我曾经在某个地方读到过在线程执行方法中休眠线程不是很好的做法。但是我可能错了。 此外,我可以使用普通的TThread类或OTL线程库。 有什么好...

11得票4回答
Delphi(XE2)Indy(10)多线程Ping

我有一个房间里面有60台电脑/设备(40台电脑和20台基于Windows CE的示波器),我想知道哪些设备还在运行,可以使用ping命令。首先,我编写了一个标准的ping命令(请参见这里Delphi Indy Ping Error 10040),现在它可以正常工作,但是当大多数计算机离线时,需...

11得票4回答
Delphi TThread.CurrentThread和EAccessViolation - 这是一个错误还是我的无能?

在Delphi 2009中,每当我在应用程序中使用TThread.CurrentThread时,当应用程序关闭时会出现以下错误消息: Exception EAccessViolation in module ntdll.dll at 0003DBBA. Access violation at...

10得票1回答
如何在后台线程中使用LoadKeyboardLayout?

我正在使用 LoadKeyboardLayout 函数以以下方式加载和激活键盘布局:procedure TfrmMain.eSearchEnter(Sender: TObject); begin LoadKeyboardLayout('00000429', KLF_ACTIVATE); e...

9得票6回答
在TThread Execute中引发异常?

我刚刚意识到我的线程中未能向用户显示异常! 起初,我在线程中使用了以下代码引发异常,但它并没有起作用: except on E:Exception do begin raise Exception.Create('Error: ' + E.Message); end; IDE向我...

9得票1回答
TThread和COM - 尽管在构造函数中调用了CoInitialize,但仍提示"CoInitialize未被调用"

我试图在线程内使用COM接口。根据我的阅读,我必须在每个线程中调用CoInitialize/CoUninitialize。 虽然这样可以正常工作: procedure TThreadedJob.Execute; begin CoInitialize(nil); // some...