我有一个GTK应用程序,我需要运行几个并行任务。应用程序从串行端口接收数据,然后根据数据,它必须在标签上显示文本并播放音频。我正在使用基于事件的串行通信,如果接收到数据,则会使标志变高。
在主循环中,我创建了3个我正在无线运行的线程。
Thread1 to read serial data
Thread2 to display data on gtk label
Thread3 to play audio
Thread1在从串口事件接收到信号时被激活。读取数据后,它将标志设置为高,然后激活Thread2。然后,Thread2对串行数据进行解码并在标签上显示其信息。然后它设置另一个标志高,激活Thread3,然后Thread3播放音频文件。
我需要并行运行Thread2和Thread3。这样标签和音频上显示的文字应该同时完成。目前我正在做类似下面的事情:
Thread2
{
while(1)
{
if(serialData == TRUE)
{
//decode the serial data and display it
startAudio = TRUE //Indicate Thread3 to play audio
serialData = FALSE
}
}
}
Thread3
{
while(1)
{
if(startAudio == TRUE)
{
//play audio
startAudio = FALSE
}
}
}
在目前的情况下,我没有太多要解码的串行数据,因此显示的文本和音频都看起来是同步的。但是,如果数据很大,那么我猜它们都不会同步。有什么方法可以并行运行这些任务。?
答案 0 :(得分:0)
您只需在主题1而不是主题2中设置startAudio = TRUE;
,例如在设置serialData = TRUE;
之后。
另一个解决方案是在线程2中设置startAudio = TRUE;
,但在解码数据之前,而不是在之后。
如果您希望数据显示而不是解码与声音同步,那么您所做的似乎是最佳解决方案,因为我认为一旦数据被解码,它就不会采取很多时间来展示它。但是,您可以尝试在显示数据之前设置startAudio = TRUE;
,但在解码之后,将同时显示数据和播放声音。
但是如果显示数据可能需要花费很多时间,那么我看到让显示和声音看起来同步的唯一方法就是在显示完成后播放声音,所以你需要在更新标签的GTK调用之后设置startAudio = TRUE;
。
同步线程的另一种方法是使用条件,它比实现更复杂,但是当线程在等待条件时,它使用的CPU比实现中的变量检查要少得多。