c++ - VNC 查看器实现

标签 c++ multithreading asynchronous mfc vnc

我们的团队正在 Windows 上实现 VNC 查看器(=VNC 客户端)。该协议(protocol)(称为 RFB)是有状态的,这意味着查看器必须读取 1 个字节,查看它是什么,然后再读取 3 或 10 个字节,解析它们,等等。

我们决定使用异步套接字和单个 (UI) 线程。因此,有两种方法:

1) 状态机——如果我们在套接字读取时遇到阻塞,只需记住当前状态并退出。稍后,套接字通知将到达,中断的逻辑将从适当的阶段恢复;

2) 内部消息循环——一旦我们确定从套接字读取会阻塞,我们就进入内部消息循环并在那里旋转,直到最终收到所有必要的数据。 因此,在出现阻塞时,UI 不会被卡住。

经验表明,第二种方法不好,因为当我们处于内部消息循环中时,任何消息都可能到来。我不能在这里说出完整的故事,但它根本不够可靠。崩溃和故障。

第一种方案似乎还可以接受,但以这种风格编程并不容易。必须记住算法的状态和进一步处理所需的所有局部变量的值。

这很可能使用多线程,但我们只是认为这种情况下的问题会更加困难:帧缓冲区访问的同步、多线程问题等。此外,即使在这种变体中似乎也有必要使用异步套接字。

那么,您认为哪种方式最好?

这个问题很普遍。这就是通过有状态协议(protocol)组织异步通信的问题。

编辑 1:我们使用 C++ 和 MFC 作为 UI 框架。

最佳答案

我做过几个并行计算项目,看起来 MPI(消息传递接口(interface))可能对您的 VNC 项目有帮助。您可能对 MPI 提供的并行计算能力不太感兴趣,但您可能希望使用简化的类似套接字的接口(interface)通过网络进行异步通信。

http://www.open-mpi.org/

您可以从 google 中找到 MPI 的其他实现和大量使用示例。

关于c++ - VNC 查看器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385432/

相关文章:

c++ - 使用指向存储在 vector 中的对象的指针... C++

windows - 从另一个线程调用 OpenGL 函数

node.js - 完成所有迭代后的 async.each 回调

javascript - For 循环、异步等待、Promise - Javascript

java - Apache Camel : async operation and backpressure

c++ - 计算将一串数字分解为 26 以下数字的方法

c++ - 内置功能可插值单个像素和小 Blob

java - 使用 java.util.concurrent.locks.Lock 而不是同步的 : can my code avoid dead-lock in a bank transfer scenario?

multithreading - 如何安全地检查另一个线程的主线程标志?

c++ - 无法分配内存