免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3367 | 回复: 10
打印 上一主题 下一主题

[C] 如何判断字符串是否有值? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-18 15:34 |只看该作者 |倒序浏览
是这样的。
有一char *str;里面用来存放发送的数据。当然,可能str为空。

如何设计,使当str有数据时,则触发事件。没有数据时,则等待。

while(1)
{
    if (strlen(str))
    {
    ....
    }
}
太浪费资源,cpu几乎100%

论坛徽章:
0
2 [报告]
发表于 2009-02-18 15:46 |只看该作者
加个定时器吧。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2009-02-18 16:10 |只看该作者
自己放数据进去后用事件通知

你是多线程的吧,还得用锁

论坛徽章:
0
4 [报告]
发表于 2009-02-18 16:20 |只看该作者
回调函数!不该你去判断,而是该相信调用者触发的事件。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2009-02-18 17:07 |只看该作者
while(1)
{
    if (strlen(str)) // 这里可以优化为 if( *str != '\0' )
    {
    ....
    }
    Sleep( 0 ); // 既然本次执行片中不为零,那么除非到下个执行片,否则还是零,所以应当放弃余下的时间片
}

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [报告]
发表于 2009-02-18 17:15 |只看该作者
设计上就蛮不好的,应当由修改str者主动通知,而不是你来轮询

论坛徽章:
0
7 [报告]
发表于 2009-02-18 17:44 |只看该作者
原帖由 langue 于 2009-2-18 16:20 发表
回调函数!不该你去判断,而是该相信调用者触发的事件。

强!把定时器轮询和触发事件都包括了。

论坛徽章:
0
8 [报告]
发表于 2009-02-18 17:58 |只看该作者
回调函数可以。不过可能考虑到使用回调函数很多人有难度,可以考虑如下方法:

考虑字符串被填充的频率:
1、如果每秒钟很多次,那就轮询,注意你的代码加个sleep。
2、如果n秒钟一次,那就是不密集,采用异步事件通知。信号、信号灯等等都是不错的方法。

论坛徽章:
0
9 [报告]
发表于 2009-02-18 18:23 |只看该作者
用睡眠的方法会阻塞别的线程,而且并不是每次修改都能得到感知。
所以,既然程序设计上有问题,就肯定得动手术,这个没办法。不知道你原先的代码是要完成什么任务。我们知道,标准库里用来排序的 qsort() 就是使用回调函数的典型范例。
回调函数其实挺方便,最多在定义含数指针的地方会遇到一点小障碍,但这算不上大问题,用熟了就好。

C/C++ 里用回调函数,对于 VB 这样的事件驱动程序设计语言就不必了。比方说,VB 里可以注册事件,然后编写事件处理程序,语言运行环境会协助你管理各种事件,你的程序甚至没有一个 main() 函数或者类似的入口点。

论坛徽章:
0
10 [报告]
发表于 2009-02-18 18:26 |只看该作者
其实……我比较好奇的是:LZ 那个臭蛋是谁误投的…… :wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP