小编Ste*_*eve的帖子

TThread在Delphi 2006控制台应用程序中的工作方式有所不同吗?

我们有一个非常成熟的COM dll,我们使用DUnit进行测试.我们最近的一个测试创建了一些线程,并从这些线程测试对象.使用gui前端运行测试时此测试工作正常,但在作为控制台应用程序运行时挂起.这是我们在测试中所拥有的快速伪视图

SetupTest;
fThreadRefCount := 0; //number of active threads
Thread1 := TMyThread.Create(True);
Inc(fThreadRefCount);
Thread1.OnTerminate := HandleTerminate; //HandleOnTerminate decrements fThreadRefCount
Thread3 := TMyThread.Create(True);
Inc(fThreadRefCount);
Thread2.OnTerminate := HandleTerminate; //HandleOnTerminate decrements fThreadRefCount
Thread3 := TMyThread.Create(True);
Inc(fThreadRefCount);
Thread3.OnTerminate := HandleTerminate; //HandleOnTerminate decrements fThreadRefCount

Thread1.Resume;
Thread2.Resume;
Thread3.Resume;

while fThreadRefCount > 0 do
  Application.ProcessMessages;
Run Code Online (Sandbox Code Playgroud)

我已经尝试在OnExecute中做任何事情,所以我确定这不是我正在测试的实际代码.在控制台中,fThreadRefCount永远不会减少,而如果我将它作为gui应用程序运行,那很好!

据我所知,OnTerminate事件没有被调用.

delphi multithreading unit-testing console-application

6
推荐指数
2
解决办法
2052
查看次数

如何使用互斥锁保护公共资源?

我有一个公共资源,我想要1,只有我的应用程序的一个实例(或它的COM API)可以随时访问.我曾尝试使用互斥锁保护此资源,但是当主机dotnet应用程序的多个线程尝试访问COM对象时,似乎没有释放互斥锁.这是我用来保护资源的代码.

repeat
  Mutex := CreateMutex(nil, True, PChar('Connections'));
until (Mutex <> 0) and (GetLastError <> ERROR_ALREADY_EXISTS);
  try
    //use resource here!
  finally
    CloseHandle(Mutex);
  end;
Run Code Online (Sandbox Code Playgroud)

如果我同时运行线程,第一个线程就会通过(显然是第一个创建互斥锁的线程),但后续线程会在重复循环中被捕获.如果我以5秒的间隔运行每个线程,那么一切正常.

我怀疑我在这里没有正确使用互斥锁,但我发现很少有关于如何执行此操作的文档.

有任何想法吗?

delphi mutex

6
推荐指数
2
解决办法
1万
查看次数

将启用unicode的Delphi 2006应用程序移植到Delphi 2009

我有一个在Delphi 2006中完全兼容unicode的应用程序.我用WideStrings替换了所有的AnsiStrings,用TNT控件替换了所有VCL控件,并将所有字符串函数从AnsiStrings更改为WideStrings.看起来所有的工作都是徒劳的,因为我将不得不扭转这一切.反正Trick Delphi 2009是否认为Widestrings实际上是UnicodeStrings?

delphi unicode delphi-2009

5
推荐指数
1
解决办法
1965
查看次数

在Delphi 2009中,我是否需要释放变体数组?

如果我有一个只包含简单类型的变量数组,以及可能的其他简单类型的变体数组,我是否需要做任何明确的事情来释放内存,或者它是否都由我来处理.我一直认为没什么可做的,但我只是有点怀疑!

delphi memory-management

5
推荐指数
1
解决办法
1893
查看次数

设置托管.NET客户端使用STA线程是否有任何原因会导致本机COM服务器中的异常出现问题?

我有一个原生(Delphi)COM服务器,广告为STA(Apartment Threaded Model).

它包含一些在某些情况下抛出溢出异常的算法.这些异常在代码中处理,如果我从主线程上的客户端访问COM服务器,一切正常.

如果客户端是本机的(Delphi),我可以从多个线程访问服务器,只要我坚持在线程上创建的对象从同一个线程进行所有方法调用的规则.

但是,如果客户端是托管客户端(Vb.NET和C#测试),如果我将客户端线程的ApartmentState设置为MTA,一切正常,但我的性能受到了影响.

我希望,因为我猜COM必须做一些jiggery pokery(即编组)以确保每个人都快乐.

但是,如果我将ApartmentState更改为STA,从而确保客户端和服务器之间的直接连接,客户端将崩溃并出现错误,通常是CustomMarshallers.dll中的System.stackoverflowexception.

如果我消除导致这些溢出的数字,那么我没有问题.

我可以通过调整算法来解决这个问题,不依赖于异常(可能首先应该如何编写),但我想了解发生的事情背后的原因.

delphi com multithreading exception-handling com-interop

5
推荐指数
1
解决办法
283
查看次数

这两组代码有什么不同

这两段代码之间有什么区别

type
  IInterface1 = interface
    procedure Proc1;
  end;

  IInterface2 = interface
    procedure Proc2;
  end;

  TMyClass = class(TInterfacedObject, IInterface1, IInterface2)
  protected
    procedure Proc1;
    procedure Proc2;
  end;
Run Code Online (Sandbox Code Playgroud)

以下内容:

type
  IInterface1 = interface
    procedure Proc1;
  end;

  IInterface2 = interface(Interface1)
    procedure Proc2;
  end;

  TMyClass = class(TInterfacedObject,  IInterface2)
  protected
    procedure Proc1;
    procedure Proc2;
  end;
Run Code Online (Sandbox Code Playgroud)

如果它们是同一个,那么它们是否有任何优点或可读性问题.

我想第二个意味着你不能编写一个实现IInterface2的类而不实现IInterface1,而第一个你可以.

delphi oop interface

4
推荐指数
1
解决办法
284
查看次数

接口"递归"和引用计数

我的接口有一个小问题.这是伪代码:

type
  Interface1 = interface
  end;

  Interface2 = interface
  end;

  TParentClass = class(TInterfacedObject, Interface1)
  private
    fChild : Interface2;
  public
    procedure AddChild(aChild : Interface2);
  end;

  TChildClass = class(TInterfacedObject, Interface2)
  private
    fParent : Interface2;
  public
    constructor Create(aPArent : Interface1);
  end;
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到这个缺陷吗?我需要孩子引用它的父级,但引用计数在这种情况下不起作用.如果我创建一个ParentClass实例,并添加一个子类,那么父类永远不会被释放.我明白为什么.我怎么绕圈呢?

delphi oop interface

4
推荐指数
1
解决办法
823
查看次数

使用泛型时如何处理Delphi Simple类型?

一个小例子

TTest<T> = class
private
  f : T;
public
  function ToString : string;
end;
Run Code Online (Sandbox Code Playgroud)

如果是一个对象,那么这应该工作

TTest<T>.ToString;
begin
  Result := f.ToString;
end;
Run Code Online (Sandbox Code Playgroud)

但是当说整数时会发生什么?这在.net中可以.当然.

我知道它不起作用,但我如何编写它来处理对象和简单类型?

delphi generics

4
推荐指数
1
解决办法
1478
查看次数

如何将classname转换为类?

我在字符串列表中有类名.例如,它可能是'TPlanEvent','TParcel','TCountry'等.

现在我想通过循环列表找出大小.

它的作用是:

Size := TCountry.InstanceSize;
Run Code Online (Sandbox Code Playgroud)

但我希望这样:

for i := 0 to ClassList.Count - 1 do
  Size := StringToClass(ClassList[i]).InstanceSize;
Run Code Online (Sandbox Code Playgroud)

显然我的问题是编写什么而不是StringToClass方法来将字符串转换为类.

delphi delphi-2007

4
推荐指数
3
解决办法
7127
查看次数

是否可以将(使用实时绑定)多个组件绑定到(非组件)对象?

我有一个对象,我们称它为 Controller,它不是一个组件,它有一个 enabled 属性。我可以使用实时绑定将其绑定到表单上某些组件的启用属性吗?即如果我的组件的 enabled 属性发生变化,绑定到它的组件会相应地设置其 enabled 属性?

如果 TController 是 TComponent 的后代,我可以看到如何做到这一点。我知道我可以将我的 TController 包装在一个组件中,但我问是否有直接的方法来做到这一点?

delphi delphi-xe2 livebindings

4
推荐指数
1
解决办法
2101
查看次数