一个关于函数互斥的问题

seabird125 2006-12-04 04:29:56
怎样实现呢


比如A 过程和B 过程都要用到某个函数function

但function保证A.B不能同时使用,如果同时调用了function,那么后调用 的那个过程就要延迟执行function.



...全文
253 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WM_JAWIN 2006-12-08
  • 打赏
  • 举报
回复
很简单啊.
function 共用()
Static Run as boolen
if run then
do until run=false
doevents
sleep 1
loop
end if


'your code


run=false
end function


嗷嗷叫的老马 2006-12-08
  • 打赏
  • 举报
回复
PS:

放线程里时,那个Sleep 1才能有效降低CPU占用率......

不然还是100%....

:(
嗷嗷叫的老马 2006-12-08
  • 打赏
  • 举报
回复
seabird125(海鸥) ( ) 信誉:60 Blog 2006-12-5 15:40:55 得分: 0

重要是这个等待。。。

//

要求不高的话,就用循环吧.....

Public Running As Boolean '函数是否在执行

Public Function TestFun(Byval S1 as long,Byval S2 as long)as boolean
TestFun=False
if Running=True then
exit function
end if
Running=True
[你的处理过程->Start]
.
.
.
.
[你的处理过程->End]
Running=false
TestFun=True
End function

调用时:

do
if testfun(s1,s2)=True then exit do
sleep 1
loop

这样应该不是个好办法...

如果要求高,就CreateThread,把调用过程放一个Thread里去吧.
bdzwj 2006-12-08
  • 打赏
  • 举报
回复
用Mutex互斥内核对象就可以

'in a form module
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const INFINITE = &HFFFF ' Infinite timeout

Private m_hMutex As Long '互斥内核对象句柄

'利用互斥内核对象进行互斥,保证只能有一个线程访问
Private Function GetOneNumber() As Long
Static lResult As Long
WaitForSingleObject m_hMutex, INFINITE
lResult = lResult + 1
ReleaseMutex m_humtex
GetOneNumber = lResult
End Function

Private Sub Form_Load()
'建立内核对象
m_hMutex = CreateMutex(0&, 0&, "Base_Mutex")

'建立两个计时器同时访问GetOneNumer(),进行测试
Timer1.Interval = 100
Timer2.Interval = 30
End Sub

'如果建立了Mutex互斥,则在窗体销毁时关闭内核对象
Private Sub Form_Unload(Cancel As Integer)
If m_hMutex <> 0 Then CloseHandle m_hMutex
End Sub

'计时器事件
Private Sub Timer1_Timer()
Text1.Text = GetOneNumber() & vbCrLf & Text1.Text
End Sub

Private Sub Timer2_Timer()
Text2.Text = GetOneNumber() & vbCrLf & Text2.Text
End Sub
VirtualDesktop 2006-12-08
  • 打赏
  • 举报
回复
全局标志变量标志函数是否正在被使用
  • 打赏
  • 举报
回复
建立一个命令队列池,和一个全局标志变量,然后循环调用FUNCTION,在FUNCTION里根据全局标志变量判断是执行还是退出。
zzyong00 2006-12-05
  • 打赏
  • 举报
回复
function中多加一个传入参数,判断是哪个过程调用的,也就是一个过程调哪个function时,要传给哪个function一个标记自己的值,在function还得加个全局变量,以判断function是否处于执行状态
chenhui530 2006-12-05
  • 打赏
  • 举报
回复
一个函数调用完了才调用另外一个

你还是把你代码帖出来的好
dingyanwei 2006-12-05
  • 打赏
  • 举报
回复
你在做多线程程序吗?

不行的话就定义个全局变量来保存调用信息
seabird125 2006-12-05
  • 打赏
  • 举报
回复
不是这样的啊。。。
seabird125 2006-12-05
  • 打赏
  • 举报
回复
不是这样的,关键是 某个过程调用这个function的时候,需要等着function被调用 再调用

重要是这个等待。。。
chenhui530 2006-12-04
  • 打赏
  • 举报
回复
本来调用就是这样的啊

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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