我在我正在开发的应用程序中遇到这种情况,我需要在同一时间做两件事情,而且我正在努力解决它。我正在开发相机应用程序,我需要在LED的同时触发相机以获得良好的图像。以下是我尝试过的选项。
使用两个主题:
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();
在单独的线程上触发当前线程和相机上的指示灯
Thread t = new Thread(
new ThreadStart(() =>
{
//trigger camera
}));
// trigger LED
t.Start();
t.Join();
在这两种情况下,我都会像10张图像一样闪烁,这意味着相机和LED不同步。我的问题是,有没有办法实现我想要做的事情。
谢谢。
答案 0 :(得分:4)
如果您有两个(或更多)操作,则可以使用
并行调用它们Parallel.Invoke( () => DoCamera(), () => DoLighting() );
然而,这是最好的尝试。无法保证,因为毕竟你可以在只有一个物理处理器的机器上执行此操作,或者它可能在重载下并且只剩下10%的CPU。
答案 1 :(得分:4)
如果您无法在硬件中解决这个问题,那么我可以在非实时操作系统(如Windows)上考虑这种方法:
Barrier
。这可以确保两个线程都已启动并在继续之前检查屏障。这有助于减少定时抖动。它并不保证两个线程同时执行其硬件操作,但它会有所帮助。如果这没有帮助,我不知道会发生什么。值得一试。操作系统不保证实时执行,但CPU速度超过3 GHZ,您可以实现惊人的实时速度。 上下文切换可能需要3000个周期,即0.000001秒。所以你绝对可以达到非常准确的时间。
答案 2 :(得分:2)
您如何控制这两个设备(USB)?您可能有两个物理CPU可以同时执行操作,但如果您的接口需要相同的通信通道,您将发现延迟。
此外,如果线程具有时间关键性,您可能希望提高线程的优先级。
如果您希望线程同步,您应该使用某种形式的线程同步,例如互斥,但除非您能保证您(和您的客户)有两个CPU,否则最好不要执行两个操作。关键部分,同时将线程设置为时间关键。有关详细信息,请参阅this answer。
答案 3 :(得分:0)
您实际需要的是硬件(相机触发器和LED)与编程框架之间的紧密耦合,以实现“实时”操作系统。 Windows不是一个实时操作系统 - 微软的目标是开发一个与其运行的硬件无关的平台。
即使是线程 - 一旦你要求CLR启动线程,无保证线程将在指定的时间间隔内开始运行(参考CLR via C#)。