【问题标题】:Progress event for TAzureBlobService and TAmazonStorageServiceTAzureBlobService 和 TAmazonStorageService 的进度事件
【发布时间】:2012-02-23 02:32:41
【问题描述】:

将数据上传或下载到云服务时(使用 TAzureBlobService 或 TAmazonStorageService),似乎没有任何方法可以获取有关上传/下载进度的反馈。

我可以看到最终调用了 TIdTCPClientCustom.Connect,并且在该函数中,如果不存在连接,它会为连接创建一个默认的 IOHandler(除非使用 SSL,否则它不会)。如果我可以为该 IOHandler 设置 OnWorkBegin、OnWorkEnd 和 OnWork 事件,那么我可以跟踪进度,但我看不到这样做。

如果使用 SSL 连接,则会创建一个 IOHandler(例如在 TAzureBlobService.PrepareRequest 中),但 IOHandler 是一个接口,没有 OnWorkBegin 等属性。

我认为解决方案是创建一个派生自 TAzureBlobService 或 TAmazonStorageService 的类,然后覆盖 PrepareRequest 方法。在那里我可以访问 TCloudHTTP 实例(因为它是在 PrepareRequest 中创建的),然后我可以访问 IOHandler。但是如何创建 IOHandler(因为它被定义为接口)并设置事件(不属于该接口)?

谢谢

【问题讨论】:

    标签: delphi delphi-xe2 indy10


    【解决方案1】:

    OnWork 事件由 TIdComponent 公开,TIdCustomTCPClientTIdIOHandler 均来自该事件。 TIdIOHandler 不是接口。

    在内部,TIdCustomTCPClient 挂钩到分配给它的任何 IOHandlerOnWork 事件。您应该将事件处理程序分配给TIdCustomTCPClient 提供的OnWork 事件,而不是直接分配给TIdIOHandler。那么在运行时分配什么样的IOHandler 就无关紧要了。

    【讨论】:

    • 感谢指点,我现在明白了。例如,在我的替换 PrepareRequest 函数中,我只需使用 (Result.Peer.GetObject as TIdTCPClientCustom).OnWorkBegin:=abc 设置工作事件。 PrepareRequest 的结果是 TCloudHTTP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多