gtk 应用程序中的多任务处理

Multi tasking in gtk application

我有一个 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
     }
   }
 }

在目前的情况下,我没有太多的串行数据要解码,所以文本显示和音频看起来都是同步的。但是如果数据很大那么我猜他们都不会同步。有什么办法可以并行 运行 这些任务吗?

您只需在线程 1 而不是线程 2 中设置 startAudio = TRUE;,例如在设置 serialData = TRUE;.

之后

另一种解决方案是在线程2中设置startAudio = TRUE;,但在解码数据之前,而不是之后。

如果你想让数据的显示而不是解码与声音同步,那么你所做的似乎是最好的解决方案,因为我认为一旦数据被解码,就不需要很多时间来展示它。但是,你可以尝试在数据显示之前设置startAudio = TRUE;,但在解码之后,这样显示数据和播放声音将并行进行。

但是如果显示数据会花费很多时间,那么我认为使显示和声音看起来同步的唯一方法是在显示完成后立即播放声音,这样你就会需要在更新标签的 GTK 调用之后设置 startAudio = TRUE;

另一种同步线程的方法是使用条件,它比您的实现更复杂,但是当线程等待条件时,它使用的 CPU 比您的实现中的变量检查要少得多。