2009-03-03 69 views
1

我很快就要完成一项大学任务,而且我需要能够调用需要很长时间(可能是infinte,它依赖于用户输入)才能执行的C++ dll。我通过VB调用它。当发生这种情况时,我的VB GUI冻结,我想让GUI响应,以便用户可以停止这个可能的无限循环。多线程的最佳方式

任何人都可以提出这样做​​的最好/最快的方式?

有点背景,C++试图使用网络摄像头在斯诺克桌上保持得分,而VB记分板很容易更新,我想编写脚本以便分析几乎是连续的,同时仍然允许用户进行交互。目前该项目需要用户按下一个按钮来开始镜头分析,但如果程序自己编写脚本,这将是更可取的。我现在才意识到这个问题,截止日期很快。

更新:我们的讲师提出了一个解决问题的选项,但看起来这里的大部分选项和他所建议的选项都不适合我们,因为摄像头图像捕获所需的处理时间太长,无法处理硬件限制。感谢您花时间帮助,非常感谢!

+1

听起来像一个非常酷的项目。 – configurator 2009-03-05 16:53:31

回答

2

在VB.NET中处理线程的最好方法是通过System.Threading命名空间。

您也可能会考虑Application.DoEvents()

+0

尽管Application.DoEvent()与线程无关。 – erikkallen 2009-03-03 22:05:00

+0

我从来没有说过:) – 2009-03-04 01:13:01

1

尝试的System.Threading马克说,也尝试寻找这是在VB.NET简单一点背景工作进程。 Readup here

0

就像替代方案一样,你可以让C++在后台实际处理。当从VB中调用时,它只是从它检索数据或发送一个命令(开始,退出,???),所有这些都将立即返回。

这也可以给你更多的可靠性,因为C++不会错过视频帧,而VB收集垃圾或做菜或任何VB在后台做的事情 - C++将让你更接近实时系统。

RE:关于如何的评论。我可能会做的是让我的VB程序向C++发送“消息”(正如我所说的)。消息只是一种思考函数/方法调用的方式 - 但通常它们会很快返回。

“开始”消息会告诉C++代码启动它的线程运行并返回。这是一个Linux C++ thread howto,我不知道你是否需要在Windows中做一些不同的事情(我不希望这样做,但是我几十年来没有用C++作为我的主要开发语言)。

如果不工作,只是谷歌“C++线程”

发送“停止”消息将停止该线程(可能免费资源)。

“获取数据”调用将转到C++线程用于存储数据的位置,并抓取并返回。

对不起,如此普遍,我相当重的Java这些天。

1

我肯定会使用Background Worker进程。您可以将它拖到窗体上,并使用DoWork子例程来实际执行冻结GUI线程的工作。您还可以使用ReportProgress事件实际提供回到表单的进度。

至于你关于两个单独的线程的问题,如果两个步骤需要很长时间才能完成,我会一个接一个地在同一个线程中运行它们。

使用该线程可能会引起你的一件事是线程交叉。在你的问题的情况下,这意味着没有你的第二个线程更新表单控件。

如何在处理交叉线程时实现此代码的一个非常好的资源是PDF

我还应该指出,如果你使用的是.net 1.0/1.1,你仍然可以做多线程,但是没有后台工作者控制的精神。你只需要从System.Threading命名空间创建一个新的线程。