3

我正在开发的应用程序中遇到这种情况,我需要同时做两件事,我有点挣扎。我正在开发一个摄像头应用程序,我需要在触发 LED 的同时触发摄像头以获得良好的图像。以下是我尝试过的选项。

  1. 使用两个线程:

    Thread t1 = new Thread(
                        new ThreadStart(() =>
                        {
                            //trigger LED here
                        }));
    
    Thread t2 = new Thread(
                        new ThreadStart(() =>
                        {
                            //trigger camera
                        }));
    
    t1.Start();
    
    t2.Start();
    t1.Join();
    t2.Join();
    
  2. 触发当前线程上的灯光和单独线程上的相机

    Thread t = new Thread(
                        new ThreadStart(() =>
                        {
                            //trigger camera
                        }));
    
    // trigger LED
    t.Start();
    t.Join();
    

在这两种情况下,我都会在大约 10 张图像后出现背面闪烁,这意味着相机和 LED 不同步。我的问题是,有什么方法可以实现我想要做的事情。

谢谢你。

4

4 回答 4

4

如果您有两个(或更多)操作,则可以使用并行调用它们

Parallel.Invoke( () => DoCamera(), () => DoLighting() );

不过,这是最好的尝试。无法保证,因为毕竟您可能会在只有一个物理处理器的机器上执行此操作,或者它可能处于重负载状态并且无论如何只剩下 10% 的 CPU。

于 2013-05-23T10:41:07.217 回答
4

如果您无法在硬件中解决此问题,那么这是我在 Windows 等非实时操作系统上能想到的最佳方法:

  1. 为两个动作中的每一个启动一个线程
  2. 将他们的优先级提高到高或实时,以确保他们立即从 CPU 中踢出其他任何东西
  3. 让他们等待Barrier。这可确保两个线程都已启动并在屏障处签入,然后再继续。这有助于减少时序抖动。它不能保证两个线程同时执行它们的硬件操作,但它会有所帮助。

如果那没有帮助,我不知道会怎样。不过值得一试。操作系统不保证实时执行,但 CPU 速度在 3 GHZ 以上,您可以获得惊人的实时速度。上下文切换可能需要 3000 个周期,即 0.000001 秒。因此,您绝对可以实现极其准确的计时。

于 2013-05-23T11:49:03.120 回答
2

你如何控制这两个设备(USB)?您可能有两个能够同时执行操作的物理 CPU,但如果您的接口需要相同的通信通道,您会发现延迟。

此外,如果线程时间紧迫,您可能希望提高线程的优先级。

如果您希望线程同步,您应该使用某种形式的线程同步,例如互斥锁,但除非您可以保证您(和您的客户)有两个 CPU,否则最好在关键部分执行这两个操作,同时将您的线程设置为时间关键。有关详细信息,请参阅此答案

于 2013-05-23T10:37:08.623 回答
0

您实际上要求的是硬件(相机触发器和 LED)与编程框架之间的紧密耦合,以实现“实时”操作系统。Windows 不是一个实时操作系统——微软的目标是开发一个与其运行的硬件几乎无关的平台。

即使对于线程 - 一旦您要求 CLR 启动线程,就无法保证线程将在指定的时间间隔内开始运行(通过 C# 引用 CLR)。

于 2013-05-23T11:31:56.130 回答