多线程的最佳方式

时间:2009-03-03 20:11:45

标签: vb.net multithreading dll

我很快就会完成大学作业,我需要能够调用一个需要很长时间(可能是infinte,它依赖于用户输入)来执行的C ++ dll。我通过VB调用它。当这种情况发生时,我的VB GUI会冻结,我希望保持GUI响应,以便用户可以停止这个可能的infinte循环。

有人能建议最好/最快的方法吗?

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

更新:我们的讲师提出了一个解决问题的选项,但看起来这里的大多数选项和他建议的选项对我们都不起作用,因为网络摄像头图像捕获所需的处理时间太大而无法处理硬件限制。感谢您抽出宝贵时间提供帮助,非常感谢!

5 个答案:

答案 0 :(得分:2)

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

您也可以查看 Application.DoEvents()

答案 1 :(得分:1)

尝试系统。正如Mark所说,也尝试查看后面的工作进程,这在VB.NET中有点简单。读取here

答案 2 :(得分:1)

我肯定会使用后台工作程序进程。您可以将其拖到表单上并使用DoWork子例程来实际执行冻结GUI线程的工作。您还可以使用ReportProgress事件实际向表单提供进度。

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

使用线程可能会让你感到困惑的一件事就是跨线程。在您的问题的上下文中,这意味着没有您的第二个线程更新表单控件。

有关如何实现此代码以及处理跨线程的非常好的资源是PDF

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

答案 3 :(得分:0)

作为替代方案,您可以让您的C ++始终在后台进行实际处理。从VB调用时,它只是从中检索数据或向它发送一个命令(start,quit,???),所有这些命令都会立即返回。

这也可以提供更多的可靠性,因为当VB收集垃圾或做菜或者后台的VB时,C ++永远不会错过视频帧--C ++会让你更接近实时系统。

RE:关于如何做出评论。

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

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

如果这不起作用,只需谷歌“C ++线程”

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

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

很抱歉这么一般,我现在非常沉重的Java。

答案 4 :(得分:0)

我很惊讶没有人建议使用BackgroundWorker