急急急~~~~~线程为什么会死掉???(50分)

L

lcl_003

Unregistered / Unconfirmed
GUEST, unregistred user!
我在线程里执行死循环和另外一台机器通讯,当判断数据有效的时候就在一个窗体的Tchart
上画线,刚开始运行很好,但是运行20分钟后线程就死了,我设断点根本就进不来,这是什么
原因啊。我在Tchart上画线是画满2000点就清掉重画。但是我发现内存也在不挺的增加,虽然
幅度很小,基本上内存到11M多的时候线程就死了,但是程序没死。这会是什么原因啊?
procedure MyThread.Execute;
begin
while (not terminated)do
begin
do
something....
Synchronize(seechartview);
end;
end;

procedure mythread.seechartview();
var
i: byte;
begin
for i := 0 to high(chartview1)do
begin
if chartview1 <> nil then
chartview1.Timer1.Enabled := True;
end;
end;

 
检查你在TTimer里的操作,还有dosometing里的操作
 
张兄,我觉得应该不是ttimer,dosomething里的原因,因为并不是一开始就死,而是执行了
20多分钟后才死的,要是ttimer里的问题应该一开始就死啊
 
如果不是这有问题,那看你的代码,难道是程序自己死掉,你一定是有地方分配资源没有释放
 
哦,张兄,好象是好了,我加了延时处理,现在跑了3个小时了。不过还是有点疑问。我用
任务管理器观察发现我的程序cpu时间很高,而且在增加,那到后来会不会出现系统死掉?
我的程序和system idle process的比较
pid cpu cpu时间 内存
我的程序 988 20 0:32 10M
system idle process 0 80 1:52 16K
 
啊-------------又死了,跑了4个小时死的,cpu时间是1小时。怎么才能让cpu时间不增加,
到底是什么原因呢?》
 
单从这些代码看不出问题来.
线程这种循环结构循环中一般要有WaitForSingleObject配合,否则
线程占用Cpu时间很高.
 
线程之间有冲突,“加了延时“只不过减小了冲突的概率。
对线程共用的资源进行检查,防止冲突,多用try...except showmessage ;
减小延时增加冲突几率,这样容易查到错误。[8D]
 
同步那些访问到的资源
 
only you, 我是同步访问的
xeen,我程序的cpu占用率并不高,在10%左右,就是cpu时间高。WaitForSingleObject有什么
用?
d983074,我除了主线程外就这一个线程了啊。线程访问了vcl,就是在Tchart上画线,需要
释放什么资源吗?我加try...except showmessage在那里加?
我线程和另外一台机器要500ms通讯一次,直到程序结束,所以写了个死循环。
 
cpu的时间是程序占用cpu的时间,也就是程序真正运行的时间。
windows是把时间分成很多时间片,每一个程序运行一点,看起来就象同时运行。
其实不是的
 
WaitForSingleObject等待某个信号并使线程休眠,不占用Cpu时间。直到有信号为止
 
一般设成300,
Wait1:=WaitForSingleObject(lpol.hEvent,300);
if ( Wait1 = WAIT_OBJECT_0) then
begin
comproc;
if Data1.R_Byte[2] <>(Data1.S_Byte[1]+Data1.S_Byte[2]) then
ShowMessage('通道返回错误的校验信息,请再次停止!');
end
else
if ( Wait1 = WAIT_TIMEOUT ) then
begin
clearcommerror(hcom,lperrors,@coms);
ShowMessage('通道没有返回信息,请再次停止!');
end;
 
那sleep会占cpu时间吧?现在我不知道是不是因为占cpu时间的问题,没啥头绪:(
 
多贴一些代码上来,
你的dosomething 主要做了什么事,看看
 
我觉得你肯定不是没有释放资源。如果资源没有释放,程序会死,而且还会蹦出错误。
但是你现在只是程序死了,没有蹦错,大概是进入死循环了吧
 
sleep也不占cpu时间
 
哦,dosomething很多,2000行吧,不过大部分都是线程里给另外的机器发送命令,另外就是
访问了Tchart,代码主要就是下面这些
procedure MyThread.Execute;
begin
while (not terminated)do
begin
do
something....
//满足条件 then
Synchronize(seechartview);
sleep(300);
end;
end;

procedure mythread.seechartview();
var
i: byte;
begin
for i := 0 to high(chartview1)do
begin
if chartview1 <> nil then
chartview1.Timer1.Enabled := True;
end;
end;
 
chartview1是个窗体数组
 
>>我觉得你肯定不是没有释放资源。如果资源没有释放,程序会死,而且还会蹦出错误。
>>但是你现在只是程序死了,没有蹦错,大概是进入死循环了吧
我也觉得是没释放资源,但是可能没有释放的就是画线了,可我又不知道怎么才算释放:(
我现在程序没有死,只是线程死了,而且也没蹦错误。就是到一定时间,线程的死循环就不执行了,也就是
不给另外的机器发命令了,但是程序本身没有死,执行什么都没问题。我在线程死的时候就
设在死循环里设断点,发现根本就不进:(
 

Similar threads

顶部