从Windows服务实时进度

时间:2011-03-24 18:43:29

标签: c++ winapi ipc rpc

我正在开发一个我认为更适合作为Windows服务的应用程序。我计划转换它时遇到的唯一问题是它有一个显示活动的窗口。现在我知道从服务中显示GUI是不好的做法(并在Win7中弃用)所以我的问题是,显示进度的最佳方法是什么?

我的第一个想法是使用RPC和MIDL的轮询方法,但是操作可以在一两秒内开始和结束,使用轮询是非常不准确的。

我的其他选择是什么?

谢谢, Ĵ

编辑:我的问题更多是关于通信方法,我计划将其拆分为服务和任务托盘图标,但我想显示一个带有进度条的窗口,以显示服务中运行的任务的进度,但轮询将太慢,除非它是次级的,这看起来很浪费,有没有办法将进度推向任务托盘应用程序?

2 个答案:

答案 0 :(得分:4)

创建一个完成工作的服务,以及一个可选的 GUI应用程序,如果正在运行,它位于系统托盘中,并允许您打开一个窗口来观察进度。您可以通过以下方式传达进度:共享内存或命名管道 - 但请记住,当没有人登录时服务正在运行,因此它决不取决于能否显示进度。

推送机制:

  • 共享内存,互斥锁和事件(CreateEvent)。每当服务更新状态时使用PulseEvent调用,让systray应用程序等待事件(例如MsgWaitForMultipleObjects)
  • 命名管道(CreateNamedPipe) - 这些也适用于系统托盘应用程序
  • TCP / UDP - 避免这种情况,你只会碰到那些不了解localhost概念的过分防火墙

答案 1 :(得分:1)

在系统托盘中创建一个图标。当您的服务正在执行其操作时,将图标更改为动画内容,并更改图标的工具提示(当用户将鼠标悬停时)以在气球文本中显示完成的进度。

编辑:第二个想法,我可能没有动画图标。只是给它一个不同的外观。把它变成红色或其他东西。