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


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

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

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


加好友 发短信
等级:六尾狐 帖子:1234 积分:8607 威望: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 ,否则程序会死在这里,无法往下继续呼叫,请问这个延时判断应该怎么写? 用回调? 用计划任务?  代码咋写? 请指教

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


加好友 发短信
等级:六尾狐 帖子:1234 积分:8607 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 8:35:00 [显示全部帖子]

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

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


加好友 发短信
等级:六尾狐 帖子:1234 积分:8607 威望: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1234 积分:8607 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 9:51:00 [显示全部帖子]

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


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


加好友 发短信
等级:六尾狐 帖子:1234 积分:8607 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 11:26:00 [显示全部帖子]

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

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


加好友 发短信
等级:六尾狐 帖子:1234 积分:8607 威望: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?     为什么第一次可以,第二次就不行了?

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


加好友 发短信
等级:六尾狐 帖子:1234 积分:8607 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/4/24 19:22:00 [显示全部帖子]

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

 回到顶部