2012-02-28 60 views
2

我需要一个本地HTTP服务器用于我的单元测试。TIdHTTPServer在我的DUnit测试中激活EThread错误6时

当我尝试在SetUp激活TIdHTTPServer,它失败ETHREAD消息:

"Thread Error: descriptor not valid (6)"

这是我如何初始化:

type 
    TestMyUnit = class(TTestCase) 
... 
procedure TestMyUnit.SetUp; 
begin 
    FServer := TIdHTTPServer.Create(nil); 
    FServer.OnCommandGet := HTTPServerCommandGet; 
    FServer.Active := True; // <---- This will cause error 
end; 

也许有使用Indy的TIdHTTPServer与DUNIT一些限制框架?

  • 德尔福2010
  • 印10

的例外是此行TIdListenerThread.Run PROC(IdCustomTCPServer单元)

LIOHandler := Server.IOHandler.Accept(Binding, Self, LYarn); 

但是,我找不到它更深某处后抛出,我不知道为什么。

+0

我必须问这个...你有没有尝试在不同的机器上运行可执行文件? – Nat 2012-02-29 02:09:12

回答

1

解决。我有我自己设计的DPK(由本单元测试使用),并且有1个单元提及Indy。在我重建了这个包之后,编译器建议我为Indy组件添加一些新的DCCReference。重新安装我的软件包后,单元测试中的错误消失了。

我无法想象因果关系,但现在没关系。

2

您可能必须允许您的DUnit可执行文件在防火墙设置中打开端口...控制面板> Windows防火墙>高级设置>入站规则。

通常windows会问你第一次可执行文件试图打开端口,但我会检查那里是否有规则。

编辑:

只需添加更多的信息,错误“描述符无效”看起来像一个Winsock错误,而且可能是因为你的代码不能打开端口。这可能是因为它在防火墙被阻塞(正如我上面提到的),或者你可能有另一个程序打开了该端口......也许像IIS一样?我会选择1024以上的端口,并设置您的Web服务器使用(并且显然是您的客户端)。

编辑2:

我的设置我的TIdHttpServer代码:

FServer := TIdHttpServer.Create(nil); 
FServer.DefaultPort := 7777; 
FServer.AutoStartSession := True; 
FServer.OnCommandGet := ServerCommandGet; 
FServer.OnCreatePostStream := ServerCreatePostStream; 

FServer.Active := True; 
+0

禁用防火墙并将'DefaultPort'设置为10080后没有变化 – Andrew 2012-02-28 08:35:32

+1

似乎我发现了这个问题。我有我自己设计的DPK(由本单元测试使用),并且有1个单元提及Indy。在我重建了这个包之后,编译器建议我为Indy添加一些新的DCCReference。重新安装我的软件包后,该错误消失了。你如何看待,我应该添加这个答案或更好地检查你的答案是否正确?我认为我的情况不是很常见。 – Andrew 2012-02-29 08:15:06

+0

我会添加一个你自己的解答你解释你做了什么,24小时后,接受它:) – Nat 2012-03-01 01:36:45