首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

突然想到VB6的多任务互斥有关问题

2013-04-20 
突然想到VB6的多任务互斥问题一个程序假如有两个窗口,这两个窗口都会访问foo函数,而foo函数会修改一组数据

突然想到VB6的多任务互斥问题
一个程序假如有两个窗口,这两个窗口都会访问foo函数,而foo函数会修改一组数据的内容。
当窗口1通过Timer触发或热键触发的方式调用foo函数,同时窗口2通过Click等事件触发(或像窗口1一样触发)调用foo.那么foo函数内部是否需要加锁做互斥?对于VB6似乎没提供什么加解锁的机制。

我是这样想的,这个问题主要是窗口1和窗口2都有不同的消息处理循环,他们处于不同的线程,理论上这两个窗口即使都通过Click等事件调用foo函数,foo函数也是需要加锁的,也就是凡是两个窗口都会访问的(有副作用的)函数都需要做互斥。但是实际上大家很少这么做,原因是鼠标只有一个,用户同一时间只可能操作一个窗口。但是如果绕过鼠标机制,比如一个窗口通过Timer来触发调用另一个窗口也会调用的函数则会有多任务访问的问题。

对于这种比较常见的场景,VB6却没有提供互斥机制来保证一组操作的原子性,我觉得VB6的设计本身是存在缺陷的。
[解决办法]
“我是这样想的,这个问题主要是窗口1和窗口2都有不同的消息处理循环,他们处于不同的线程”
你确认它们在不同的线程吗?如果是VB6的话很抱歉是单线程机制的。
[解决办法]
一个窗体上的两个timer会产生互相阻塞.
两个窗体上的两个timer也一样会产生阻塞.

引用:
“我是这样想的,这个问题主要是窗口1和窗口2都有不同的消息处理循环,他们处于不同的线程”


很抱歉,任务管理器显示编译后的程序仅仅只有一个线程,虽然有多个窗体.
[解决办法]
如果不是用户自己来实现线程和消息循环,则VB只默认只提供一个线程和一个消息循环(当然COM控件内部用作交互的消息循环或者使用ActiveX EXE多线程不算),不管你有多少窗口。
没有多线程就没有多任务,哪怕用DoEvents也一样,因此不存在互斥问题。
[解决办法]
模式窗口只是冻结除自己之外的其它窗口,也就是除了自己之外,线程内其它窗口一概 enabledwindow(xx,false) , 这只是设置窗口可用状态,并非冻结线程, 否则msgbox 或者说模式窗口也没法运行了
[解决办法]
系统的 MessageBox 只是禁用了调用窗体,不影响其他窗体。
而 VB 的 MsgBox 做了封装,禁用了所有的窗体,效果等于用一个消息框独占了整个程序的操作。

明显这是个很有效的设计,简化了程序的处理方式。
[解决办法]
多虑了,VB都是单线程,除非你用API创建线程,那是很不稳定的,很少有人用

热点排行