为什么我的线程suspend后,线程依然运作?如果分不够,我可以再加,请高手指教 ( 积分: 100 )

  • 主题发起人 主题发起人 huwei1118
  • 开始时间 开始时间
H

huwei1118

Unregistered / Unconfirmed
GUEST, unregistred user!
做了个电话录音的东东,在线程里检测电话的摘挂机,并录音.
系统主窗口show后,初始化成功,在登陆窗口登陆后,线程开始运作.现在想实现,注销时将线程停止,不记录电话信息.我已在注销时加入了NewThreadObject.suspend,再登入时,又加入了NewThreadObject.resume 可是进入主程序后,依然会把注销后的电话信息记录下来.请问各位高手该如何处理.部分代码如下:
procedure ScanThread.Execute;
begin
while not Terminateddo
begin
try
CheckNetData();//检查网络数据传输
if TV_GetEvent( @e) > 0 then
begin
//获取事件
case e.EventType of
TEvent_GetFsk,//得到FSK来电
TEvent_GetDTMF://得到DTMF来电
begin
frmUsbMain.VoiceSystemInfo.Lines.Add(e.data.Buf);
//接收来电号码
end;

TEvent_OffHook: // 拨号后,被叫方摘机事件
begin

end;

TEvent_Ring: ;
//frmUsbMain.VoiceSystemInfo.Lines.Add('来电响铃');
TEvent_DialEnd: // 拨号结束事件
//frmUsbMain.VoiceSystemInfo.Lines.Add('拨号结束');
;
TEvent_Busy: // 检测到忙音事件
//frmUsbMain.VoiceSystemInfo.Lines.Add('忙音');
;
TEvent_PlayEnd: // 放音结束事件
//frmUsbMain.VoiceSystemInfo.Lines.Add('播放完毕');
;
TEvent_HangUp: // 挂机事件
//frmUsbMain.VoiceSystemInfo.Lines.Add('对方挂机');
;
TEvent_InterHangUp:// 本地电话机挂机
begin
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[357]);
TelEndTime:=now;
StrCopy(TelAndDiskinfo.ChannelInfo.CallFileName,PChar(VoiceFileName+#0));
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[358]+DateTimeTostr(TelEndTime));
TV_StopRecordFile(lrecid,false);//结束录音
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[20]+floattostr(CountSecond(TelStartTime,TelEndTime)));
TelAndDiskinfo.ChannelInfo.CallKeepTime:=CountSecond(TelStartTime,TelEndTime);
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[359]);
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.subStr[117]+VoiceFileName);
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.subStr[78]+string(TelAndDiskinfo.ChannelInfo.CallDKey));
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[360]);
if SaveRecord(TelAndDiskinfo.ChannelInfo) then
begin
frmUsbMain.VoiceSystemInfo.Lines.add(LanguageInfo.SubStr[147]);
end
else
begin
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[361]);
end;

if To660=true then
SendTelInfo(TelAndDiskinfo);//向数据共享区传信息
if To6600=true then
//向6600传送数据
begin
FrmUsbMain.IdTCPClient1.Host:='127.0.0.1';
FrmUsbMain.IdTCPClient1.Port:=8001;
if not FrmUsbMain.IdTCPClient1.Connected then
FrmUsbMain.IdTCPClient1.Connect();
if SendDataNet(TelAndDiskinfo) then
begin
//showmessage(LanguageInfo.SubStr[362]);
//exit;
end
else
showmessage(LanguageInfo.SubStr[363]);
if lrecid >= 0 then
//判断是否成功保存了录音文件
begin
if SendFileNet(VoiceFileName) then
//showmessage('网络传文件成功')
else
showmessage(LanguageInfo.SubStr[364]);
end;

end
else
;//停止向6600发送数据
for mm:=0 to 255do
TelAndDiskinfo.ChannelInfo.CallDKey[mm]:=' ';
end;
TEvent_InterOffHook://本地话机摘机
begin
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[365]);
//TV_SetRecSource(2);
TelStartTime:=now;
begin
timestr:=trim(DateTimeToStr(TelStartTime));
StrCopy(TelAndDiskinfo.ChannelInfo.Callbegin
Time,PChar(begin
timestr+#0));
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[24]+DateTimeTostr(TelStartTime));
//getdir(0,syspath);
//设置录音格式(Gsm610无法设置此格式)
if systeminfo.VoiceFileFormat=ALow then
RecordFormatResult:=TV_SetRecordFileFormate(0);//设置WF_LINE
if systeminfo.VoiceFileFormat=GSM610 then
RecordFormatResult:=TV_SetRecordFileFormate(1);//设置Alow
lrecid:=0;
if RecordFormatResult then
lrecid := TV_StartRecordFile(CreateFilePathAndFileName(1,SystemInfo.VoiceSavePath,VoiceFileName), 0, 0);
if lrecid =-1 then
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[366])
else
frmUsbMain.VoiceSystemInfo.Lines.Add(LanguageInfo.SubStr[367]);
end;

TEvent_PlugOut://设备移除
//frmUsbMain.VoiceSystemInfo.Lines.Add('设备移除');
;
TEvent_PlugIn://设备接入
//frmUsbMain.VoiceSystemInfo.Lines.Add('设备接入');
;
TEvent_Nobody: //无人接听
//frmUsbMain.VoiceSystemInfo.Lines.Add('无人接听');
;
TEvent_StopCallIn://呼入停止
//frmUsbMain.VoiceSystemInfo.Lines.Add('呼入停止');
;
TEvent_GetChar:// 收到DTMF码事件
begin
frmUsbMain.VoiceSystemInfo.Lines.Add(String(LanguageInfo.SubStr[368]) + e.Data.Buf);
//if e.Data.Buf[1] = '*' then
begin
//ShowMsg('提示:接收到*');
end;
end;

TEvent_TelCallOut: //电话机呼出。也就是电话机拨号后听到回铃音
//frmUsbMain.VoiceSystemInfo.Lines.Add('本地话机拨号后听到回铃');
;
TEvent_TelDial: //检测到话机拨号DTMF码
//如果需要最新的一个DTMF只要取最后一个buf
begin
frmUsbMain.VoiceSystemInfo.Lines.Add(String(LanguageInfo.SubStr[369]) + e.Data.Buf);
for mm:=1 to length(e.Data.Buf)do
TelAndDiskinfo.ChannelInfo.CallDKey[mm]:=e.Data.Buf[mm];
//if e.Data.Buf[StrLen(PChar(@e.Data.Buf[1]))] = '*' then
// begin
//ShowMsg('提示:接收到*');
// FrmUsbMain.lbMsg.AddItem('提示:接收到*',nil);
//end;
end;
end;

end;
except
//showmessage('程序出错');
end;
sleep(100);
end;
////////////////////////////////////////////////////////////////////
注销时
if LogoType= Logoin then
begin
EnableFunctional(LogoIn);
if assigned(NewThreadObject) then
if NewThreadObject.Suspended then
NewThreadObject.Resume;
FrmUsbMain.ShowSysteminfo(UGrs60login.UserName+LanguageInfo.SubStr[375]);
end;

if LogoType= LogoOut then
begin
EnableFunctional(LogoOut);
if not NewThreadObject.Suspended then
NewThreadObject.Suspend;
FrmUsbMain.ShowSysteminfo(UGrs60login.UserName+LanguageInfo.SubStr[376]);
end;
//////////////////////////////////////////////////////////////////
我在界面上做了测试按钮,一个是suspend,一个是resume 发现程序暂停后,也是依然记录电话信息.请高手指教
 
好像是suspend之后还要Free一下,你试一下!
 
free不管用,程序死在那里不动了.[:(]
 
个人认为,在线程外用suspend来停止线程是不安全的,因为无法预知线程会执行到那里停止。
我做多线程的都是定义一个boolean变量,每当线程完成一轮的工作后检查这个变量,当为某值时将线程挂起。如:
while not Terminateddo
begin
................
if not FAction then
self.Suspend;
end;
这样,我要挂起线程时只要设FAction 为false就可以了。
 
帮你顶一个
 
我的线程中,主要是事件捕捉,只有摘挂机时才有事件,暂时是不会出现问题的.奇怪的是,在暂停之后,我打电话的信息依然被记录下来了.
 
需要反应时间[:D]
 
只知道线程停止的时候会出现你上述问题,暂时还不知道线程suspend的时候出现那种问题,我也关注一下
 
YOYO_GEGE说的对,我的程序也是用线程,觉得很不好把握,线程有反应时间的,学习,希望高手出招~
 
后退
顶部