同时运行两个代码c#

时间:2013-05-23 10:28:14

标签: c# parallel-processing

我在我正在开发的应用程序中遇到这种情况,我需要在同一时间做两件事情,而且我正在努力解决它。我正在开发相机应用程序,我需要在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();
    
  3. 在这两种情况下,我都会像10张图像一样闪烁,这意味着相机和LED不同步。我的问题是,有没有办法实现我想要做的事情。

    谢谢。

4 个答案:

答案 0 :(得分:4)

如果您有两个(或更多)操作,则可以使用

并行调用它们
Parallel.Invoke( () => DoCamera(), () => DoLighting() );

然而,这是最好的尝试。无法保证,因为毕竟你可以在只有一个物理处理器的机器上执行此操作,或者它可能在重载下并且只剩下10%的CPU。

答案 1 :(得分:4)

如果您无法在硬件中解决这个问题,那么我可以在非实时操作系统(如Windows)上考虑这种方法:

  1. 为两个操作中的每一个启动一个主题
  2. 将他们的优先级提升到高或实时,以确保他们立即踢出CPU上的任何其他内容
  3. 让他们等待Barrier。这可以确保两个线程都已启动并在继续之前检查屏障。这有助于减少定时抖动。它并不保证两个线程同时执行其硬件操作,但它会有所帮助。
  4. 如果这没有帮助,我不知道会发生什么。值得一试。操作系统不保证实时执行,但CPU速度超过3 GHZ,您可以实现惊人的实时速度。 上下文切换可能需要3000个周期,即0.000001秒。所以你绝对可以达到非常准确的时间。

答案 2 :(得分:2)

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

此外,如果线程具有时间关键性,您可能希望提高线程的优先级。

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

答案 3 :(得分:0)

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

即使是线程 - 一旦你要求CLR启动线程,无保证线程将在指定的时间间隔内开始运行(参考CLR via C#)。