小编jpf*_*ius的帖子

Indy写入缓冲/高效TCP通信

我知道,我问了很多问题......但是作为一个新的delphi开发人员,我一直在讨论所有这些问题:)

使用印10.为了使通信效率这一个与TCP通信交易,我编写一个客户端操作请求作为单个字节(在大多数情况下,接着,当然其他数据字节,但在这种情况下,只有一个单一的字节).问题是

var Bytes : TBytes;
...
SetLength (Bytes, 1);
Bytes [0] := OpCode;
FConnection.IOHandler.Write (Bytes, 1);
ErrorCode := Connection.IOHandler.ReadByte;
Run Code Online (Sandbox Code Playgroud)

不立即发送该字节(至少不调用服务器执行处理程序).如果我将'1'更改为'9',例如一切正常.我假设Indy缓冲了输出字节,并尝试禁用写缓冲

FConnection.IOHandler.WriteBufferClose;
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.如何发送单个字节并确保立即发送?并且 - 我在这里添加另一个小问题 - 使用indy发送整数的最佳方法是什么?不幸的是,我无法在TIdTCPServer的IOHandler中找到像WriteInteger这样的函数......而且

WriteLn (IntToStr (SomeIntVal))
Run Code Online (Sandbox Code Playgroud)

对我来说似乎不是很有效率.是否有所作为我是否使用多个写命令行或字节数组一起收拾东西,并发送一次?

谢谢你的回答!

编辑:我补充说,我使用的是印地10日以来似乎有关于读了重大变化,写程序的提示.

delphi performance tcp client-server indy

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

对象的引用计数

在我的代码中,我使用了一个小型数据存储类,它在不同的地方创建.为了避免内存泄漏并简化操作,我想使用引用计数,所以我做到了

type TFileInfo = class (TInterfacedObject, IInterface)
Run Code Online (Sandbox Code Playgroud)

并删除了我对TFileInfo.Free的所有手动调用.不幸的是Delphi报告了很多内存泄漏.搜索SO我发现以下问题解释了为什么这不起作用:

为什么不收集TInterfacedObject垃圾的后代?

这里有一个解决方法,但它需要我(至少如果我做对了)编写一个自定义接口IFileInfo并为它提供了许多getter和setter,我想避免它.

编辑我应该补充一点,我将创建的FileInfo对象插入到两种不同类型的哈希表中:一个来自TBucketList,另一个是来自Codegear论坛的哈希映射实现.在内部它们都是用户指针,因此情况就像在另一个问题中一样.

还有其他可能使Delphi中的对象使用引用计数吗?

delphi interface reference-counting tinterfacedobject

8
推荐指数
2
解决办法
5530
查看次数

德尔福和i18n

Delphi是否以任何方式支持国际化?

我已经看到我可以为项目添加不同的语言,但这似乎创建了dfm文件的多个实例.我是否正确,因此语言无法在运行时更改?

你如何处理国际化(如果你这样做)?有没有最好的做法?

delphi delphi-2009 internationalization

8
推荐指数
2
解决办法
2176
查看次数

D2009中的泛型是否可用于大型项目?

我非常沮丧.我正在使用Delphi 2009,并且很高兴在这个版本的Delphi中包含泛型.一切都在一开始就很好用,但是现在我在整个地方使用泛型我遇到了问题 - 大多数时候是一些内部错误,我甚至都看不到它们究竟在哪里造成的.我尝试多次重构代码以避免泛型问题,但总是遇到新的问题.

现在我决定完全删除泛型并使用一些动态强制转换来专门化我的类.不是很激动,但我没有看到另一种选择.我不能花一天时间追踪Delphi的内部编译错误......

是否有人在大型项目中使用泛型而没有遇到这样的问题?也许是我的错吗?或者只是不可能在复杂的项目中使用它们?

我希望D2010修复所有这些东西.

delphi generics delphi-2009

8
推荐指数
2
解决办法
565
查看次数

什么会导致部分处理泄漏?

这是我上一个问题的后续问题.

正如我在上一个问题的答案中所建议的那样,我使用ProcessExplorer来分析我的应用程序用来查找句柄泄漏的句柄列表.

泄漏的句柄属于Section类型.

什么是截面句柄,它在哪里使用以及什么可能导致截面手柄泄漏?

我没有在我的代码中使用内存映射文件.

windows delphi handle resource-leak delphi-xe

8
推荐指数
1
解决办法
3300
查看次数

函数返回记录与接口字段

在询问有关记录中的接口字段的这个问题,我假设以下内容可以正常工作(注意断言):

type
  TRec <T> = record
    Intf : IInterface;
  end;

  TTestClass = class
  public
    function ReturnRec : TRec <Integer>;
  end;

  // Implementation 
  function TTestClass.ReturnRec : TRec <Integer>;
  begin
    Assert (Result.Intf = nil);    // Interface field in record should be initialized!
    Result.Intf := TInterfacedObject.Create;
  end;
Run Code Online (Sandbox Code Playgroud)

我用以下代码测试了这个:

  for I := 1 to 1000 do
    Rec := Test.ReturnRec;
Run Code Online (Sandbox Code Playgroud)

并且断言失败了!

我的错在哪里?什么假设是错的?

delphi delphi-xe

8
推荐指数
1
解决办法
1164
查看次数

自定义组件和Tab键顺序

我有一个自定义组件(继承自TCustomPanel),由两个其他组件组成(比方说两个编辑).如何在使用组件时正确获取Tab键顺序?

在Tab键顺序设计器中,我只能访问无法获得焦点的组件本身,因为它是一个面板.在运行时发生的事情是我可以使用tab键访问编辑,但只有在组件下方的两个按钮聚焦后才能访问.

如何在这种情况下更改Tab键顺序?

delphi components vcl delphi-xe

8
推荐指数
1
解决办法
4173
查看次数

如何在Delphi中进行异步编程?

我有一个应用程序,其中大多数操作需要一些时间,我希望始终保持GUI响应.用户触发的任何操作的基本模式如下:

  1. 准备动作(在主线程中)
  2. 执行动作(在后台线程中保持gui响应)
  3. 显示结果(在主线程中)

我尝试了几个方法来实现这一目标,但从长远来看,所有这些都会导致问题(在某些情况下看似随机访问违规).

  1. 准备操作,然后调用后台线程,并在后台线程的末尾,用于Synchronize调用OnFinish主线程中的事件.
  2. 准备操作,然后调用后台线程,并在后台线程的末尾,用于PostMessage通知GUI线程结果已准备就绪.
  3. 准备操作,然后调用后台线程,然后忙等待(在调用时Application.ProcessMessages)直到后台线程完成,然后继续显示结果.

我无法想出另一种选择,但这对我来说都不是很完美.这样做的首选方法是什么?

delphi multithreading asynchronous delphi-xe

8
推荐指数
2
解决办法
760
查看次数

记录泛型集合中的相等性

假设您有一个带有重载相等运算符的记录

TSomeRecord = record
  Value : String;
  class operator Equal(Left, Right : TSomeRecord) : Boolean;
end;
Run Code Online (Sandbox Code Playgroud)

(实现比较字符串值).如果根据重载运算符向列表中添加两个相等的记录,我希望该Contains方法在两种情况下都返回true.但实际上,通用列表似乎只是比较记录的内存内容而不是应用重载的相等运算符.

var
  List : TList <TSomeRecord>;
  Record1,
  Record2 : TSomeRecord;

begin
Record1.Value := 'ABC';
Record2.Value := 'ABC';
List.Add(Record1);

Assert(List.Contains(Record1));
Assert(List.Contains(Record2));    //  <--- this is not true
end;
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?有什么解释吗?

delphi generics record operator-overloading delphi-xe2

8
推荐指数
1
解决办法
1682
查看次数

从通用容器中检索TProc

刚发现一些相当有趣的东西

var
  Queue  : TQueue <TProc>;
  MyProc : TProc;
...
MyProc := Queue.Dequeue;
Run Code Online (Sandbox Code Playgroud)

我想你看到这里有什么意思.但是,编译器认为我想存储Queue.Dequeue方法(键入"对象的过程")MyProc并报告错误

E2010 Incompatible Types: 'TProc' und 'Procedure of object'
Run Code Online (Sandbox Code Playgroud)

我想出的解决方法是这样的

MyProc := TProc (Pointer (Queue.Dequeue));
Run Code Online (Sandbox Code Playgroud)

有更优雅的解决方案吗?

delphi

7
推荐指数
2
解决办法
473
查看次数