您尚未登录。

楼主 # 2022-09-19 12:37:44

gaocangjian
会员
注册时间: 2022-08-08
已发帖子: 32
积分: 39

minigui中,如何创建线程。

Tina3.5.1中自带的UI是 minigui ,这东西比较老,相应的资料也少。
现在我遇到一个问题:

怎么在minigui的应用程序框架中添加自己的线程?

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

程序中同时使用了 wav播放库 和 modbus库。

wav不用说,如果一定时间内没有给驱动程序送数据流,他就会卡住,表现是声音断断续续。

实测在tinyplay库中:
pcm_writei(ctx.pcm, music_buffer, frame_count) 该函数,如果没有即时调用就会卡顿。

函数内部最终实现的接口是:
ioctl(pcm->fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, &x)

也就是说 pcm_writei 如果没有及时被执行,则 pcm_writei 会阻塞大约512ms(平时根据设置缓存的大小 几十到100多ms) . 这段时间按个人理解是 重新启动初始化了 pcm设备。

而modbus干脆在读取设备时,干脆就是一个阻塞函数...等待目标地址的设备回应 如果超出规定时间 则放弃该次通讯,报告错误。
仅仅读一个线圈寄存器 我都需要为他花费至少40ms的时间。9600波特率 传输1个字节 大约不到1ms ,来回的报文大概都用掉了 10多MS。

我现在的问题就是 这两者无法 合理的分配时间。。。如果在播放过程中穿插modbus指令,声音就会时不时卡顿。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我试着用一个进程来 单独完成播放wav的工作 在程序中添加
void *thread_fun(void *arg)
{
    pthread_t tid;
   
    while(1)
    {
           tid = pthread_self();
               printf("hello %u~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n",(unsigned int)tid);
           sleep(500);
    }
}

并在int MiniGUIMain(int argc, const char *argv[])函数最开始的地方添加 :pthread_create(&id,NULL,thread_fun,NULL);

结果是没什么鸟用....仅仅在应用启动时 输出一条 printf("hello %u~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n",(unsigned int)tid);
后面就毫无动静了。。。minigui正常工作。但是不会一直重复打印内容。

大佬们,有什么高招吗?

最近编辑记录 gaocangjian (2022-09-19 12:40:20)

离线

楼主 #1 2022-09-19 12:57:04

gaocangjian
会员
注册时间: 2022-08-08
已发帖子: 32
积分: 39

Re: minigui中,如何创建线程。

解决了.....我的天...
sleep居然所s级延迟.... 跟windows不一样.
改成usleep就可以了 这玩意是微妙级的

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn