MFC中 多线程定时的问题
弱菜最近在写一个点菜系统(小学期……),然后服务端开了一个监听的线程,在监听的线程里面又有一个线程对每一个SOCKET的内容进行处理。然后现在问题是:客户端有一个查看上菜...
弱菜最近在写一个点菜系统(小学期……),然后服务端开了一个监听的线程,在监听的线程里面又有一个线程对每一个SOCKET的内容进行处理。然后现在问题是:客户端有一个查看上菜情况请求和催菜请求。我用一个全局变量处理了上菜请求,其中SLEEP()函数的参数和这个全局变量有关。但是这样的话如果有催菜请求,因为开了一个新的线程了,所以即使更新了全局变量,但是上菜请求中的这个变量值没有改变。想问一下有什么办法么? 因为是在线程中所以设置CEVENT似乎也没什么用,SetTimer函数的话又要写个消息环(不会),所以有什么其他更好的办法没?
展开
展开全部
你描述的不太清楚。
1、全局变量实际上是和所定义和所引用的具体代码文件有关的。作用域要看你如何定义和引用的
2、假定上面没问题是全进程都可用的,那么你的问题好像是指在不同线程中读和写;
3、你所谓的多线程场景描述的不清楚,不如直接黏贴相关代码段说明;
4、一般可以——服务端监听(主要)线程一个,然后每accept一个connection,就可以新建一子线程处理该connection的请求,处理完就退出,这样就是会有多线程不断动态生成和退出。至于所谓请求参数的载体,全局变量虽然奏效但建议尽可能别用,可以作为监听线程的内部参数,然后通过线程创建时的context中放置其引用或指针形式,从而传给各子线程。最后,为了避免读写冲突,需要加保护,比如CriticalSection或mutex等;对了,在MFC中可以根据此原理套用其相关的虚拟成员函数中
1、全局变量实际上是和所定义和所引用的具体代码文件有关的。作用域要看你如何定义和引用的
2、假定上面没问题是全进程都可用的,那么你的问题好像是指在不同线程中读和写;
3、你所谓的多线程场景描述的不清楚,不如直接黏贴相关代码段说明;
4、一般可以——服务端监听(主要)线程一个,然后每accept一个connection,就可以新建一子线程处理该connection的请求,处理完就退出,这样就是会有多线程不断动态生成和退出。至于所谓请求参数的载体,全局变量虽然奏效但建议尽可能别用,可以作为监听线程的内部参数,然后通过线程创建时的context中放置其引用或指针形式,从而传给各子线程。最后,为了避免读写冲突,需要加保护,比如CriticalSection或mutex等;对了,在MFC中可以根据此原理套用其相关的虚拟成员函数中
追问
定义在STDAFX中,全进程可用,问题正是在不同线程中的读和写。即,一个线程要读取这个全局变量,但另一个线程在这过程中可能(也可能不会)对全局变量进行修改,因为两个线程是并行的,所以第一个线程读取的值很大可能仍然没变。如何解决?我设置了CCriticalSection类,但是可能是方式不对,仍然达不到效果,因为第一个线程读取临界区时会LOCK住,这时候及时开启第二个线程,也会等到第一个线程结束才执行,没有用
追答
这个不复杂,至于正确使用,只要查看相关的CCriticalSection类的msdn说明及samples
Event也是一种同步对象,当然可以用,但个人觉得你的代码流程并不复杂,读写全局变量的代码很短,用临界区保护即可
展开全部
CEvent为什么不行?其配合WaitForSingleObject()我觉得可以满足你的要求。
1。定义一个全局的CEvent eve;
2。在读全局变量的线程中调用WaitForSingleObject(eve.m_hObject,INFINITE);从而阻塞线程。
3.在写全局变量的线程中写完全局变量的时候调用eve.SetEvent()产生事件,使读全局变量的线程WaitForSingleObject()运行一次。
这样只有当写一次全局变量,才会读一次全局变量。
1。定义一个全局的CEvent eve;
2。在读全局变量的线程中调用WaitForSingleObject(eve.m_hObject,INFINITE);从而阻塞线程。
3.在写全局变量的线程中写完全局变量的时候调用eve.SetEvent()产生事件,使读全局变量的线程WaitForSingleObject()运行一次。
这样只有当写一次全局变量,才会读一次全局变量。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询