Foxtable(狐表)用户栏目专家坐堂 → 编写电话外呼系统,按钮事件中,要等待反极信号传回全局变量,代码怎么写?


  共有2498人关注过本帖树形打印复制链接

主题:编写电话外呼系统,按钮事件中,要等待反极信号传回全局变量,代码怎么写?

帅哥哟,离线,有人找我吗?
ycwk
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
编写电话外呼系统,按钮事件中,要等待反极信号传回全局变量,代码怎么写?  发帖心情 Post By: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/4/23 15:06:00 [只看该作者]

整个按钮代码放到计划任务中就可以,循环改改

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

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



 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 8:35:00 [只看该作者]

想了一下,把呼叫下一行放在挂机事件中恐怕不行, 那样的话不是每次挂机都会从头开始呼叫?  计划任务具体又放什么代码呢?  能不能帮忙理个思路出来?

 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 9:51:00 [只看该作者]

现在关键是wav文件只能生成一次,我第一次在播放完毕后删除, 第二次就死活生成不了,能否帮忙看看上述代码有什么问题?


 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 11:26:00 [只看该作者]

第二次生成了,但是里面没有语音,只有一个空文件,难道 语音输出不能输出第二次?  奇怪

 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 12:19:00 [只看该作者]

终于找到了,把   sp.Speak( Vars("NoticeContent") ,DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)      中的 vars("NoticeContent") 替换成一个字符串变量就好了,莫非又是狐表的一个bug?     为什么第一次可以,第二次就不行了?

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/24 12:36:00 [只看该作者]

回复7楼,尝试这样。

 

全局代码那里定义

 

Public sp As New DotNetSpeech.SpVoice()

 

掉用的时候直接写

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 19:22:00 [只看该作者]

8楼袍哥说的对, 为什么要把sp 定义成全局变量才行呢?

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/24 19:43:00 [只看该作者]

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

 

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


 回到顶部