以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  编写电话外呼系统,按钮事件中,要等待反极信号传回全局变量,代码怎么写?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=84127)

--  作者:ycwk
--  发布时间:2016/4/23 14:50:00
--  编写电话外呼系统,按钮事件中,要等待反极信号传回全局变量,代码怎么写?
做了一个电话通知系统, 表中有若干人员需要通知,
下面的代码写在"外呼"按钮中,定义了一个全局变量  IsNextCall  ,在 

   Tables("电话通知记录表").Filter=  "通知标志=True"         \'循环检测 逐个通知"通知记录表"中为True的记录
      For Each dr1 As Row In Tables("电话通知记录表").Rows
      If dr1("通知内容") <> Nothing Then     \'如果通知内容不为空

…………摘机
…………拨号
    Vars("IsNextCall")=False       
    Do While Vars("IsNextCall")=False    \'如果变局变量变为True,则执行继续往下一行的代码       不能用这个循环,程序会死在这里,无法检测摘机事件.
     System.threading.Thread.Sleep(3000)         \' 延迟3秒
    Loop
    Vars("IsNextCall")=False
   MessageBox.show(Vars("IsNextCall"))  
   Next    \'继续呼叫表格中的下一行


在全局代码中: 调用了 电话语音盒子的dll,    
厂商定义有一个  
select case
 case   对方摘机
     语音盒子播放通知的内容      
     语音盒子挂机
     Var("IsNextCall")=True  
   exit select           
 case    …………

end select 


问题是不能用 do while 循环判断全局变量 IsNextCall ,否则程序会死在这里,无法往下继续呼叫,请问这个延时判断应该怎么写? 用回调? 用计划任务?  代码咋写? 请指教

--  作者:Hyphen
--  发布时间:2016/4/23 15:06:00
--  
整个按钮代码放到计划任务中就可以,循环改改

Do While Vars("IsNextCall")=False    \'如果变局变量变为True,则执行继续往下一行的代码       不能用这个循环,程序会死在这里,无法检测摘机事件.
    System.threading.Thread.Sleep(500)         \' 延迟3秒
    Application.DoEvents
Loop

一般电话语音盒 开发接口都会有摘机、挂机事件的吧,在 挂机事件中呼叫表格中的下一行不就行?



--  作者:ycwk
--  发布时间:2016/4/24 8:35:00
--  
想了一下,把呼叫下一行放在挂机事件中恐怕不行, 那样的话不是每次挂机都会从头开始呼叫?  计划任务具体又放什么代码呢?  能不能帮忙理个思路出来?
--  作者:ycwk
--  发布时间:2016/4/24 8:58:00
--  
  Select Case EventData.lEventType         
                Case BriSDKLib.BriEvent_RemoteHook  And CurrentTable.Name="电话通知记录表"           \'通过反极信号检测到对方摘机,且当前表是电话通知记录表,避免正常外呼电话摘机后也播放语音          
                    \' MessageBox.Show("对方摘机")        
                                                   
                     Dim sp As new DotNetSpeech.SpVoice()
                     Dim Stream As new DotNetSpeech.SpFileStreamClass()
                     Stream.Open("Voice\\NoticeContent.wav",DotNetSpeech.SpeechStreamFileMode.SSFMCreateForWrite , False) 
                             
                     For Each v As object In sp.getVoices          \'用for each循环找到名称包含 Lily的语音库 
                        If v.GetDescription Like "*LiLy*" Then                       
                           sp.Voice  = v
                           Exit For
                        End If
                     Next

                     sp.AudioOutputStream = Stream  
                    \' MessageBox.show( Vars("NoticeContent")  )              
                     sp.Speak( Vars("NoticeContent") ,DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)
                     Stream.Close ()
                                                                  
                 m_tagpstnData(Vars("intChannelID" )).lPlayFileHandle = BriSDKLib.QNV_PlayFile(Vars( "intChannelID" ),BriSDKLib.QNV_PLAY_FILE_START,0,0,"Voice\\NoticeContent.wav" )    \'播放通知内容语音        如果没有语音,则会直接挂机,请注意! 

                     \'以下为循环检测播放句柄是否一直有效,播放完毕后就挂机
                     Do While    BriSDKLib.QNV_PlayFile(Vars("intChannelID"),BriSDKLib.QNV_PLAY_FILE_ISPLAY,m_tagpstnData(Vars("intChannelID" )).lPlayFileHandle ,0,0)                  \' 播放句柄句柄一直有效
                                  System.threading.Thread.Sleep(3000)         \' 延迟3秒
                                  Application.DoEvents
                     Loop
                              \'MessageBox.show("出循环")                          
                     BriSDKLib.QNV_SetDevCtrl(Vars("intChannelID"), BriSDKLib.QNV_CTRL_DOHOOK,0)       \'挂机    不知道是否 不通过人工拨号出去的时候,盒子可以直接挂机,手动测试不出来。待程序写好后才知
                     Vars("IsNextCall")=True     \'把全局变量置为True ,使得 "电话通知"按钮事件知道可以进行下一个电话呼叫了
               \'  End If      \'结束----如果通知内容不为空
                \'Next      \'往下移动到表中下一条通知记录
                          
                 Exit Select 

上面是摘机事件中的代码,但是目前程序只能正常外呼第一个电话时播放语音,第二个第三个第四个都只能打通,无法播放语音。   而且  NoticeContent.wav 第一次有语音,后面拨号时里面也确实是没有语音,不知何故!

--  作者:ycwk
--  发布时间:2016/4/24 9:51:00
--  
现在关键是wav文件只能生成一次,我第一次在播放完毕后删除, 第二次就死活生成不了,能否帮忙看看上述代码有什么问题?


--  作者:ycwk
--  发布时间:2016/4/24 11:26:00
--  
第二次生成了,但是里面没有语音,只有一个空文件,难道 语音输出不能输出第二次?  奇怪
--  作者:ycwk
--  发布时间:2016/4/24 12:19:00
--  
终于找到了,把   sp.Speak( Vars("NoticeContent") ,DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)      中的 vars("NoticeContent") 替换成一个字符串变量就好了,莫非又是狐表的一个bug?     为什么第一次可以,第二次就不行了?
--  作者:大红袍
--  发布时间:2016/4/24 12:36:00
--  

回复7楼,尝试这样。

 

全局代码那里定义

 

Public sp As New DotNetSpeech.SpVoice()

 

掉用的时候直接写

 

sp.Speak(Vars("NoticeContent"), DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync)


--  作者:ycwk
--  发布时间:2016/4/24 19:22:00
--  
8楼袍哥说的对, 为什么要把sp 定义成全局变量才行呢?
--  作者:大红袍
--  发布时间:2016/4/24 19:43:00
--  
以下是引用ycwk在2016/4/24 19:22:00的发言:
8楼袍哥说的对, 为什么要把sp 定义成全局变量才行呢?

 

重复的new对象有可能出问题。也没必要重复new