应用程序图形用户界面开发平台

4

我来自C++& MFC背景,想知道是否有更好的(可维护性/定制性)平台来开发应用程序GUI?

我们正在开发工业应用程序(机器视觉),其中:
- 性能至关重要(目前主要在CPU上进行图像处理,但GPU即将取代)
- 低层硬件接口(内部PCI设备,帧捕获卡,运动卡)
- 实时数据可视化(图像/统计图)
- 未来规划包括网络化以进行分布式处理和远程访问。

对于我们来说,跨平台不重要,因为该系统在受控环境中运行(客户只关心系统是否运行,并且他们获得了输出)。

还存在迁移成本的问题(第三方依赖项,开发人员和服务人员的培训成本)

编辑
上述“图像处理”的澄清:
我指的是“图片”(矩阵格式中的2D信息),而非图形(通常为3D向量)。目前,我们使用第三方图像库(用于空间域处理,例如分割、OCR/OCV、形态学、模式匹配)并整合我们的结果逻辑。

3个回答

3
如果您需要高性能的图形处理,那么C++/DirectX或C++/OpenGL是您的最佳选择。在这两者中,C++/DirectX可能更易于维护。
话虽如此,根据您实际进行的处理,您可能需要将部分UI移动到更易于维护的平台上。.NET框架/WPF可以做一些非常惊人的事情,并且通过良好实现MVVM等模式,可以非常易于维护。同样,在网络方面,WCF将许多常见协议从代码中抽象出来,使得网络代码更加清晰易于维护。您甚至可以使用C++/CLI编写未管理处理和托管层之间的转换层。
话虽如此,这一切都非常主观。我无法根据您的要点做出足够的判断,以确定您是否可以将部分或全部处理卸载到.NET/C#。这值得考虑,但我的直觉告诉我这可能不是您的最佳选择。

就我个人而言,我正在将一个MFC GUI重写为C#/WPF。现在,我并不是说C++代码写得很好,但我发现用C#/WPF编写的代码比现有的MFC GUI更快、响应更快。部分原因是因为在C#中并行处理事情非常容易,在几行代码中就可以完成,而在C++中可能需要数百甚至数千行代码才能完成。话虽如此,MFC控件似乎在处理具有大量项目的ComboBoxes等类似任务方面落后于WPF。 - Nathan Ernst
@Nathan:是的,我也是一个大粉丝。除了3D游戏之外,我通常建议使用C#/WPF。在这种情况下,根据他的要求,我还没有做出决定。它可能可以用C#/WPF完成——我肯定很想用C#/WPF来完成这个有趣的项目——而且它会相当高效,但是……它是否足够高效呢?我不确定。 - Randolpho
还应该注意的是,在我说服管理层使用Python之前,我们需要采取一种比喻性的方式。我有3周时间从零开始编写一个应用程序,将任意格式的金融头寸迁移到中央清算对手方,而且没有内部库。当我能够在不到10分钟的时间内迁移100万个头寸,并且代码足够灵活以适应快速变化的需求时,他们被说服了。 - Nathan Ernst
@Nathan Ernst:关于性能方面,我不会与你有任何争议。对于99%的所有选项来说,以C#、Java或Python(使用Unladen Swallow、PyPy或Psycho)形式管理、JITted代码与无管理的代码相比,在长时间运行的过程中速度几乎是一样快或者更快。当然,在图形处理部分仍然存在注意事项,但是...是的。 - Randolpho
另外,@YeenFei,根据您的编辑,我认为C#可能会解决问题,尽管在任何语言中,您要处理的实际处理过程都将是复杂和困难的。如果您的处理库已经成熟稳定,那么更改它可能不是明智之举。 - Randolpho
显示剩余2条评论

3
作为Qt的粉丝,如果不提到它,我会感到遗憾。
  • 虽然跨平台不是您的标准之一,但这是一个很好的奖励。
  • Qt还通过OpenGL具有良好的视频硬件支持(我不确定它是否对捕获硬件有所帮助)。
  • 它是开源的,所以您可以尽情发挥。
  • 它高度可定制。
  • 它正在积极开发,并拥有庞大的社区。
  • MFC程序员不应该遇到太多麻烦来适应。

您还应阅读一些以下问题和答案:

Windows下好的C++ GUI库 https://stackoverflow.com/questions/610/gui-programming-apis


我同意Arnold的看法。Qt是当前不错的选择。我在上一个医疗设备合同工作中使用了它,结果很好。我尤其欣赏信号槽机制。 - ExpatEgghead

2

在开发C++科��应用程序时,我以前所做的就是完全基于控制台的应用程序开发。这种基于控制台的应用程序可以接受用户键盘输入的各种类型的命令,并据此执行相应的操作。例如:

image_processor > load input.png
image_processor > save out.png

这样做的好处是,我可以百分之百地集中精力设计算法,而不用太担心如何适应GUI框架。无论是MFC还是QT。
最终,我只需将基于控制台的应用程序的STDIN钩子简单地连接到GUI应用程序通信通道上,而不是从键盘输入流读取输入。我的GUI应用程序将通过字符串命令与控制台应用程序进行交互并接收反馈。
猜猜我用什么来开发GUI?是Java Swing :)
我想我采用了Unix人的方法。看看Joel是怎么说的:
假设你让一个Unix程序员和一个Windows程序员各自创建同样的最终用户应用程序任务。Unix程序员将创建一个命令行或文本驱动的核心,并偶尔在此基础上构建一个GUI。这样,应用程序的主要操作将对其他程序员可用,他们可以在命令行上调用程序并读取文本结果。Windows程序员则倾向于从GUI开始,偶尔加入一个脚本语言,可以自动化GUI界面的操作。
我意识到采用Windows方法,你最终会得到一个更加用户友好的应用程序。然而,如果你的主要关注点是撰写复杂的算法,GUI只是次要的,我建议你采用Unix方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接