请教个简单线程问题,在线等

wangan1985 2008-06-22 10:21:33
一个单线程程序中两个函数,一个CSocket数据接收处理函数中对数据data进行了重新初始化操作,另外一个OnTimer函数,进行数据的显示操作,这样会出现数据冲突吗?(就是说OnTimer函数执行到一半的时候前一个函数被处理了),按照单线程函数来说应该不会,但是这个困惑源自于我遇到的另外一个问题:一个别的程序给我发CSocket消息,就是在CSocket数据接收处理函数中打出一个MessageBox,按照我对单线程的理解第一次打出MessageBox之后程序应该停止了,但是这个时候其实还是会谭出下一个MessageBOx,所以就问下达人们怎么理解单线程这个东西,是不是只要单线程就不用管数据同步的问题?是的话如何理解我遇到的那个现象呢?是因为MessageBox的原因吗?在线等待
...全文
139 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoteng1984 2008-07-20
  • 打赏
  • 举报
回复
你的代码收到了第1个CSocket,创建了MessageBox, 该MessageBox接收到了第2个CSocket,创建了第2个MessageBox
imdthowru 2008-06-25
  • 打赏
  • 举报
回复
楼上正解
cnzdgs 2008-06-22
  • 打赏
  • 举报
回复
单线程不会出现数据访问冲突,所以也就不需要考虑同步。
上面的现象是因为:每个线程有一个消息队列,线程中创建的所有窗口的消息都通过这个消息队列来传递,MessageBox函数内部有消息循环处理代码,所以当消息队列中收到Socket消息时,也会得到响应。如果你把MessageBox换成其它没有消息循环的函数,例如Sleep,就不会有这种现象了。
wangan1985 2008-06-22
  • 打赏
  • 举报
回复
那就是说我的第一个问题,两个函数中如果不出现模态对话框的话是不会产生数据不同步现象的,可以放心的运行吗?
jameshooo 2008-06-22
  • 打赏
  • 举报
回复
单线程都是单步执行没错,但是被模式对话框接管的消息循环会使窗口过程重入,重入后又产生模式对话框,又被新的消息循环接管,窗口过程再次重入,如此周而复始。

在不停接收某个消息时,消息处理函数应该避免使用模式对话框,或者在处理函数中通过静态变量阻止函数重入。
DarknessTM 2008-06-22
  • 打赏
  • 举报
回复
OnTimer如果是 WM_TIMER的话,就是单纯的单线程

而用函数指针方式的Timer,似乎是系统线程调用的

所有可能存在多线程问题

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧