多线程操作时发生的问题

winstonbonaparte 2010-05-25 01:46:23
在程序中,设备异步不停的发送信息上来,我将接收到的信息存至一个TList中存放,并且使用了TRTLCriticalSection,另一个线程A也是不停的在执行,当判断这个TList.Count 大于0时,就将信息取出,进行分析后存至数据库。当然,这里也用到了临界区。但现在有这样的一个问题,程序运行了几天之后(有时候是一天,有时候是两三天),线程A就不执行操作了。我查看过,那个TList的count不断在上升,而线程A就是不处理
...全文
176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
z184931481 2010-06-03
  • 打赏
  • 举报
回复
关注,等高手
SQLDebug_Fan 2010-05-28
  • 打赏
  • 举报
回复
写多线程一定要用ProceXP,看到线程状态和堆栈就很好定位,就知道线程卡在什么地方了?还可以通过MAP地址找到代码行。
winstonbonaparte 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 suihu 的回复:]

更新数据和界面时,要加同步(Synchronize)。

系统异常后,线程会挂起。
[/Quote]
我在这个线程里面有执行一个过程,而这个过程里有加另一个临界区对另一个线程的TList进行操作。
我这个线程调用那个过程的时候才有更新数据和界面的,这也需要加Synchronize吗?
如果挂起了,那又要如何判断和恢复?
iqyely 2010-05-28
  • 打赏
  • 举报
回复
关注下。
ok1411 2010-05-26
  • 打赏
  • 举报
回复
当判断这个TList.Count 大于0时,就将信息取出,进行分析后存至数据库
还有这里,你是不是一次只处理了一条?只处理一条的话肯定会有遗留下来的
ok1411 2010-05-26
  • 打赏
  • 举报
回复
线程A也是不停的在执行,这个什么意思?
每当有消息时去唤醒就可以了
ok1411 2010-05-26
  • 打赏
  • 举报
回复
估计是线程的问题,是不是处理中出异常了?
SQLDebug_Fan 2010-05-26
  • 打赏
  • 举报
回复
用ProceXP查看一下线程状态和堆栈,看线程是停在哪个地方,然后就好定位问题了。
sanguomi 2010-05-26
  • 打赏
  • 举报
回复
这种要看代码才知道。
winstonbonaparte 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 imho888 的回复:]

你使用了临界区按道理应该是没问题的
或者你试试线程同步或锁

或者自己定义一个WaitFor
[/Quote]
主要是一开始是没有问题的,只有运行了一段时间之后才会出现这样的错误
suihu 2010-05-26
  • 打赏
  • 举报
回复
更新数据和界面时,要加同步(Synchronize)。

系统异常后,线程会挂起。
luojun198305 2010-05-26
  • 打赏
  • 举报
回复
估计是你的线程由于异常或其它原因挂起了
sanguomi 2010-05-26
  • 打赏
  • 举报
回复
线程不执行,你检查下线程状态,有可能你线程都挂了。
winstonbonaparte 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ok1411 的回复:]

线程A也是不停的在执行,这个什么意思?
每当有消息时去唤醒就可以了
[/Quote]
线程A
while not Terminated do
begin
end;

那个队列是通过设备回调函数传上来的数据增加进去的。就算我只处理一条也没关系的啊,我从这队列取出一条赋给一个变量,然后就从这个队列里删了它的。然后再慢慢去处理这条数据的
imho888 2010-05-25
  • 打赏
  • 举报
回复
你使用了临界区按道理应该是没问题的
或者你试试线程同步或锁

或者自己定义一个WaitFor

1,593

社区成员

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

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