以文本方式查看主题 - 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 |