【问题标题】:Can the TWebBrowser be used in a thread in Delphi without Application.ProcessMessages?可以在没有 Application.ProcessMessages 的情况下在 Delphi 中的线程中使用 TWebBrowser 吗?
【发布时间】:2013-07-15 15:00:01
【问题描述】:

我正在尝试使用 TWebBrowser 在 Delphi 服务器应用程序 (XE2) 中创建网页的屏幕截图。屏幕截图是通过对我的服务器的 Web 服务调用启动的,因此为了保持可伸缩性,我希望在不依赖关键部分或 Application.ProcessMessages 来进行网页渲染的情况下为请求提供服务。

这可以用 TWebBrowser 完成吗?

【问题讨论】:

  • 我不明白为什么不这样做。 Application.Processmessages 肯定是不需要的。提示:查看 DocumentComplete 事件。
  • @whosrdaddy,你确定吗?使用 TWebBrowser 的典型示例必须处理消息,以便控件初始化并完成其内部工作。消息处理时应用程序处于空闲状态,或者您调用 ProcessMessages。对于服务器,我不确定它在等待处理请求时空闲的可靠性有多高。安迪,试试embedding Chrome instead.
  • 这个问题似乎已经被问过多次了。例如:stackoverflow.com/questions/3735410/…
  • @DavidM:Chrome 占用的空间非常大,如果可能的话,我想在我的应用程序中避免使用(因此我最初提出了关于 TWebbrowser 的问题)。
  • @DavidHeffernan:我用 TWebBrowser 标记了您引用的问题,以便将来更容易找到。

标签: delphi delphi-xe2 twebbrowser


【解决方案1】:

我已经在许多对象中做到了这一点,遗憾的是,TWebBrowser 对象与它的父对象非常相关,特别是它的 HWND 句柄。 (另见 TWebBrowser.HandleNeeded)

我得到的最好结果是将 TWebBrowser 和表单封装在 ActiveX 库中,因此它背后的“消息泵”与主应用程序分离。 ActiveX/COM 以这种方式处理所有线程和同步问题。

【讨论】:

  • 这很不幸,但似乎就是现实。我将尝试使用 ActiveX 方法,如果我成功了,我会向您报告。感谢您的帮助。
【解决方案2】:

尝试将 TWebbrowser 放在单独的 exe 中。这会将其转移到不同的线程/进程,您将获得模块化、可伸缩性和性能。 Web 服务可以使用 IPC 或消息传递与拥有 Web 浏览器的进程进行通信。

使用队列系统来跟踪屏幕捕获进程的捕获任务分配和完成情况,或为每个要捕获的站点运行 exe。

使用此方法的另一个好处是,如果捕获程序崩溃,Web 服务仍可用于接收请求。 Web 服务可以在分配任务之前检查 exe 进程是否在内存中,如果没有(崩溃或未启动),它可以自行启动 exe。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2021-07-02
    • 2012-03-21
    • 2013-05-28
    • 2015-12-27
    • 2011-02-15
    • 2011-05-23
    相关资源
    最近更新 更多