运行WinForm的“背景”功能(VS2010 c ++)

时间:2011-07-31 14:46:03

标签: c++ winforms visual-studio-2010

我有一个运行时间超过几小时的功能.. 我想要点击一个按钮,这个功能将开始运行,点击anoter按钮(停止)这个功能将停止(中断) - 但问题是当功能运行时表单变得“卡住” - 并且没有选项按停止按钮。 那么如何在不粘贴表单的情况下运行函数呢?

第二个问题是我如何制作按钮停止 - 如何在功能运行时断开功能(在功能之外......)

我的理由是创建一个只运行该函数的新表单。主表单可以在运行时关闭此表单 - 是否有更好的解决方案?

谢谢!

3 个答案:

答案 0 :(得分:2)

阅读一些关于线程概念的内容。 WinAPI提供了启动新线程和控制它的两个函数,为它们搜索MSDN - 创建一个新表单是不可取的。

答案 1 :(得分:2)

如果您可以使用.NET 4,请查看任务并行库。到目前为止,这是处理.NET(包括WinForms)应用程序的线程的最简单方法。

http://msdn.microsoft.com/en-us/library/dd460717.aspx

使用C ++:

http://msdn.microsoft.com/en-us/library/gg675934.aspx

您的后台代码可以在任务中运行,而开始/停止按钮可以设置一个标志,指示任务是否应该处理工作。

听起来,现在,您正在处理向用户界面处理消息的同一线程上工作。如果用户界面线程正在忙于进行计算,则它无法获取停止按钮的单击事件。

答案 2 :(得分:2)

在主线程中,为计算任务创建一个运行数小时的工作线程。 Win32 API CreateThread应该对此有所帮助。 See the function help herean example here

然后,您需要与工作线程进行通信,特别是在单击“停止”按钮时通知它停止。有很多方法,PostThreadMessage应该是最方便的方法之一。 Refer to the function help here

因此,当单击“停止”按钮时,将向您的工作线程发送一条消息,并且您的工作线程会定期检查主线程是否发出此类“停止”信号。您可以决定“定期”检查的方式,从而决定在发出“停止”信号时您的工作线程的响应能力。