DELPHI程序在运行中莫明其妙退出(调用了DLL,应用了线程)(200分)

  • 主题发起人 主题发起人 公孙剑影
  • 开始时间 开始时间

公孙剑影

Unregistered / Unconfirmed
GUEST, unregistred user!
用DELPHI写的一个录音服务程序..调用了录音卡的DLL.进行录音.
程序中只有一个CLOSE.就是在退出按钮中.当程序在运行中莫明其妙退出.
而且现象是几天或十几天一次..程序中也应用于了线程..
是否调用DLL不成功会退出程序.还是线程出线问题.退出了程序....
 
比较隐蔽的错误,没代码基本上没人能判断
 
這些現象通常從代碼表面不能一下看出來,
你的問題還是隨機的,從下面的幾個點去檢查:
1.你的程序里面是否經常創建大量的對象,而你使用後又沒有free,確認使用了對象後free;
2.我以前也用過線程,特別是重復使用線程,要注意線程的順序和是否線程沒有結束又創建一個線程;
當線程里發生錯誤的時候通常程序就會關閉;
3.做一個錯誤跟蹤器,把發生錯誤的時間,錯誤信息保存到起來,回頭再看是那里發生了錯誤
 
调用DLL不成功应该不会退出程序.
可能线程有问题.
 
你是用的什么版本?
Delphi6中有时就是出现那种莫名的情况,是Delphi的问题!
我在Delphi6下经常出现莫名退出,在Delphi7下编绎后没有了那种现象
 
用的是DELPHI5...程序中并没有很多对象建立 ,只有一二个.ADODATASET
并都释放掉了..由于代码较多.所以不是很方便COPY上来.
程序中应用了二个线程..一个是永久线程..即程序一运行就运行直到程序结束.
另一个是在Timer1Timer事件时执行的线程..每十秒执行一次...
一般一秒就可以执行完毕.
 
1.Timer1Timer里面的線程有沒有可能同時觸發?
假如沒有運行完又觸發了Timer1Timer事件這樣可能就會出錯?
2.應該設一個全局變量保存線程的hanld,運行線程之前都檢測這個變量到底有沒有其他線程運行?
 
应该不会同时触发...因为线程里的东东.一秒就可以执行完了.
//这是触发线程序代码Timer1.Interval:=1000;
procedure TFrmMain.Timer1Timer(Sender: TObject);
var iSecond:integer;
begin
iSecond:=StrToInt(FormatDateTime('ss',now));
if iSecond mod 10=0 then
TZTThread.Create(false);
end;
//线程序代码
procedure TZTThread.Execute;
begin
if Terminated or application.terminated then
exit;
....其它代码......
end;
是否线程运行完后没有释放
 
安全的做法應該這樣:
procedure TFrmMain.Timer1Timer(Sender: TObject);
var iSecond:integer;
begin
Timer1.enabled:=false;
iSecond:=StrToInt(FormatDateTime('ss',now));
if iSecond mod 10=0 then
TZTThread.Create(false);
Timer1.enabled:=true;
end;
Free TZTThread 線程試一下
 
Free TZTThread 線程試一下
TZTThread没有Free 属性...
 
procedure TFrmMain.Timer1Timer(Sender: TObject);
var iSecond:integer;
begin
try
Timer1.enabled:=false;
iSecond:=StrToInt(FormatDateTime('ss',now));
if iSecond mod 10=0 then
TZTThread.Create(false);
Timer1.enabled:=true;
except
///這里你把錯誤信息,日期時間保存到一個txt文件里面,看看是不是這里出錯了
end;
end;
 
试了不是那里出错.
 
我也碰到类似问题。
最后只有重建了,真倒霉!
 
到另外的机器上重新测试!
 
你设置TThread的FreeOnTerminate := true
不知道会不会好一点
 
谢谢参与
 
谢谢参与
 
后退
顶部