同时运行两个代码c#

我在我开发的应用程序中遇到这种情况,我需要在同一时间完成两件事情,我有点挣扎。 我正在开发相机应用程序,我需要在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不同步。 我的问题是,有没有办法实现我想要做的事情。

谢谢。

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

  1. 为两个操作中的每个操作启动一个线程
  2. 将他们的优先级提升到高或实时,以确保他们立即踢出CPU上的任何其他内容
  3. 让他们在Barrier上等待。 这可以确保两个线程都已启动并在继续之前检查屏障。 这有助于减少定时抖动。 它不能保证两个线程同时执行其硬件操作,但它会有所帮助。

如果这没有帮助我不知道会是什么。 值得一试。 操作系统不保证实时执行,但CPU速度超过3 GHZ,您可以实现惊人的实时速度。 上下文切换可能需要3000个周期,即0.000001秒。 所以你绝对可以达到极其准确的时间。

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

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

但是,这是最好的尝试。 不能保证,因为毕竟你可以在只有一个物理处理器的机器上执行它,或者它可能在高负载下并且只剩下10%的CPU。

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

此外,如果线程的时间要求很高,您可能希望增加线程的优先级。

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

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

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