天气预报功能在我之前的文章https://blog.csdn.net/ljm_c_bok/article/details/78764305已经做过一些总结。这次在7703平台上,再开发一个天气预报功能,网络socket框架还是跟之前的文章一样的。还有一些问题点还需要重新认识一下。
一、socket封装HTTP协议,要封装好请求报文
在CSDN上看到了大佬的文章https://blog.csdn.net/a19881029/article/details/14002273,感谢大佬分享。
由于是socket直接发送请求,不像浏览器会给我们封装好请求报文,我们只要输入一个网址就行。所以我们在请求时,应当封装好符合规范的报文。
暂时遇到这么一个问题,有遇到新问题再来更新
二、thread 线程
在之前的文章中我是将天气预报的socket的事件都注册在当前线程(TAPP task),由于在发送请求之后,需要在这里等待接收数据,所以使用了while(1)阻塞等待socket事件的到来,这会导致主线程全都被阻塞,所有的消息都不能被处理。发现这个问题是因为在弹出的等待窗口的动画会卡住。然后任意按多个案件,会导致案件失效。通过抓取log,发现是因为按键消息队列满。也就是说,此时的按键消息没有被处理,一直阻塞在队列里。对比其他的界面、任务。不会发生按键失效、按键消息队列满的情况。
分析我的业务流程、首先怀疑当前TASK被阻塞。于是把当前的while(1)注释,发现不会出现按键失效的问题。于是在激活PDP的同时,创建了一个线程SCI_CreateThread,然后将socket的事件绑定在这个线程中处理,借助多线程完成任务,保证主线程不会阻塞。
多线程这里还是出现了小插曲。我在新线程中等待socker的event,通过SCI_GetSignal从当前的TASK的消息队列得到信号,发现被阻塞在这里,也就是说消息队列此时为空,怎么回事?
1、排除了线程优先级
2、排除了我的请求正常发送(因为我并没有给TASK发送这些socket信号,这些消息是socket自己产生的,只有请求发送了,服务器端才会给我回应,这时才能有我所要监听的信号产生)
转换一下思路。既然消息队列里是空的,那就是有可能根本没有消息到发送这个TASK,那么上诉第二点的验证是可以成立的,但是通过trace消息可以看到我的请求是发送成功的。继续在trace里抓取socke的状态,最后发现在请求发送之后,socke被close了,这也就是为什么注册在TASK里的事件为什么没有产生,都close了怎么可能产生。