Multi tasking in gtk application
我有一个GTK应用程序,需要并行运行一些任务。应用程序从串行端口接收数据,然后根据数据,它必须在标签上显示文本并播放音频。我正在使用基于事件的串行通信,如果接收到数据,则将标志置高。
在主循环中,我创建了3个无限运行的线程。
1 2 3 | Thread1 to read serial data Thread2 to display data on gtk label Thread3 to play audio |
Thread1在收到来自串行端口事件的信号时被激活。读取数据后,它将标志设置为高电平,然后激活Thread2。然后,Thread2解码串行数据并在标签上显示其信息。然后,它将另一个标志设置为高电平,从而激活Thread3,然后Thread3播放音频文件。
我需要并行运行Thread2和Thread3。这样,标签和音频上显示的文本应同时进行。目前,我正在执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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中设置
另一种解决方案是在线程2中设置
如果您希望数据的显示而不是解码与声音同步,那么您所做的似乎是最好的解决方案,因为我认为一旦对数据进行解码,就不需要花费很多时间。很多时间来显示它。但是,您可以尝试在显示数据之前但在解码之后设置
但是如果显示数据需要花费很多时间,那么我看到的使显示和声音似乎保持同步的唯一方法是在显示完成后播放声音,因此您需要在更新标签的GTK调用之后立即设置
同步线程的另一种方法是使用条件,它比实现更复杂,但是当线程等待条件时,它比实现中的变量检查使用的CPU要少得多。