多线程操作

winstonbonaparte 2010-06-01 11:14:18
上一张贴子http://topic.csdn.net/u/20100525/13/d9a7487a-9ee5-4c67-826b-eb7ab7e1fe2c.html问题还没解决。
我现在在临界区里增加了判断那个线程的Suspended状态,如果它为True,表示它为挂起,我就Resume一下。
但现在发现线程明明已经挂起了,但是Suspended状态还是为False,这该怎么解决啊
...全文
167 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQLDebug_Fan 2010-06-04
  • 打赏
  • 举报
回复
哪查一下是不是在接收数据的时候,没有数据返回,主线程卡住了,加个超时。
winstonbonaparte 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xjwy 的回复:]

你用AddTask增加需处理的数据就可以了,很安全
[/Quote]
你好,我按照你的这个改了后,主线程在刚开始的时候能接收到设备上传的信息,但大概十秒之后就不再接收了,好象主线程都被卡住了
SQLDebug_Fan 2010-06-03
  • 打赏
  • 举报
回复
对,检查以下在操作TList的时候是否做了线程安全的控制。
xjwy 2010-06-03
  • 打赏
  • 举报
回复
你用AddTask增加需处理的数据就可以了,很安全
xjwy 2010-06-03
  • 打赏
  • 举报
回复
TList是非线程安全的类,你若果在线程操作Tlist ,要用TThreadList类

该类

pxxxx = ^自定义结构
TxxThread = class(TThread)
private
List: TList;
ThreadList: TThreadList;
procedure addTask(p: pXXXX)
end;
procedure TxxThread.addTask(p: pXXXX)
begin
ThreadList.add(p);
end
procedure TxxThread.Execute
begin
try
while true do
begin
Sleep(1);
List := ThreadList.LockList;
if List.Count = 0 then
begin
ThreadList.UnlockList;
Continue;
end;

p := List[0];
List.Delete(0);
ThreadList.UnlockList;
Dispose(p);
end;
except
end;
end;
简单的例子,看看吧
MinxSoft 2010-06-03
  • 打赏
  • 举报
回复
执行了几次Suspend就需要相应的执行几次Resume才能使线程恢复,跟这个有关系没?
z184931481 2010-06-03
  • 打赏
  • 举报
回复
关注,碰到同样问题,不知道是程序问题还是DEPHI的问题,等高手解决问题
iqyely 2010-06-01
  • 打赏
  • 举报
回复
关注下。
SQLDebug_Fan 2010-06-01
  • 打赏
  • 举报
回复
另外线程都有原子操作,看看是否由这个引起的。
SQLDebug_Fan 2010-06-01
  • 打赏
  • 举报
回复
看了一下TThread的代码:

var
OldSuspend: Boolean;
begin
OldSuspend := FSuspended;
try
FSuspended := True;
{$IFDEF MSWINDOWS}
CheckThreadError(Integer(SuspendThread(FHandle)) >= 0);
{$ENDIF}
{$IFDEF LINUX}
CheckThreadError(pthread_kill(FThreadID, SIGSTOP));
{$ENDIF}
except
FSuspended := OldSuspend;
raise;
end;
end;

发生这类问题的原因代码执行出错了。
ok1411 2010-06-01
  • 打赏
  • 举报
回复
判断那个Suspended状态好像不是很准确的,你需要唤醒的时候不用判断,直接resume即可
SQLDebug_Fan 2010-06-01
  • 打赏
  • 举报
回复
看线程状态最好的工具还是ProceXP,如果线程堆栈停在某个带Lock的函数上,肯定就是锁住了。
winstonbonaparte 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 logne 的回复:]

不会用console模式,就直接写文件呗。。
加了临界区就得确认一下临界区是否加对了。

还有你循环判断TList中是否有内容是放到子线程中了还是放到主线程里了?是不是你的子线程直接执行完毕了,只不过没有释放罢了
[/Quote]
程序在刚开始运行的时候都是没问题的,都能正确的识别。就是在运行了一段时间之后才会出现这种问题的,从代码上看应该是没有问题的
logne 2010-06-01
  • 打赏
  • 举报
回复
不会用console模式,就直接写文件呗。。
加了临界区就得确认一下临界区是否加对了。

还有你循环判断TList中是否有内容是放到子线程中了还是放到主线程里了?是不是你的子线程直接执行完毕了,只不过没有释放罢了
winstonbonaparte 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 logne 的回复:]

用console模式,线程执行过程中在命令行里写信息。。
[/Quote]
不会用console模式。而且我在操作TList的时候都加了临界区了啊
logne 2010-06-01
  • 打赏
  • 举报
回复
用console模式,线程执行过程中在命令行里写信息。。
winstonbonaparte 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 logne 的回复:]

你的线程是不是死锁了,你的主线程和子线程都要操作TList,主线程执行add时会把子线程的delete操作阻塞掉吧。你可以输出信息看看子线程是在什么时候被挂起的。
[/Quote]
怎么看?
logne 2010-06-01
  • 打赏
  • 举报
回复
你的线程是不是死锁了,你的主线程和子线程都要操作TList,主线程执行add时会把子线程的delete操作阻塞掉吧。你可以输出信息看看子线程是在什么时候被挂起的。
winstonbonaparte 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ok1411 的回复:]

判断那个Suspended状态好像不是很准确的,你需要唤醒的时候不用判断,直接resume即可
[/Quote]
直接resume是不行的。唤醒不了的

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧