模式窗口打开导致线程挂起问题

jlbnet 2004-07-17 03:04:38
最近项目里要用到串口通讯,同时又不想让程序别的部分响应变慢,就用了线程。结果发现,如果有其他窗口以模式方式打开(ShowModal),结果有时线程就莫名其妙地挂起了

线程执行过程是这样的:

procedure TTIDRealtime.Execute;
begin
while not (tRealtime.terminated) do
begin
Synchronize(ProcessAll);
end;
end;
ProcessAll是一个过程,负责具体的业务处理。
实在搞不懂为什么会挂起。不是每次都出现,但出现一次,业务处理就停顿下来了,进行不下去
请问有没有碰到过这样的问题?该怎么处理?
...全文
123 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbExpress 2004-07-19
  • 打赏
  • 举报
回复
不懂,帮顶了
jlbnet 2004-07-19
  • 打赏
  • 举报
回复
业务处理线程中并没有直接用到界面交互。需要交互的界面是非模式打开的。
我指的是模式打开其他与线程无关的窗体时出现的。并且这种挂起并不是每次都出现,有时挂起,有时正常
fanshousu 2004-07-19
  • 打赏
  • 举报
回复
首先必须明白,如果你的业务处理过程中设计到了有关界面的操作,那么这种情况是正常的;因为线程中的有关界面的操作本质上不是真正多线程,其实是发送消息给主线程;而模态窗体也是给主线程发送消息(但是需要客户的触发,在触发之前其他的一般都会停止)
dbExpress 2004-07-19
  • 打赏
  • 举报
回复
是来混分的:)

不过你的问题,我觉得挺古怪,所以多问了一句,


我很怀疑Ifindit的说法
谢谢你这么大方
jlbnet 2004-07-19
  • 打赏
  • 举报
回复
to: dbExpress(老枪)
不会是来混分的吧 :)

我用的是 Delphi6,问题基本上解决了
dbExpress 2004-07-19
  • 打赏
  • 举报
回复
楼主用的是Delphi几啊?
jlbnet 2004-07-19
  • 打赏
  • 举报
回复
"必须在主进程中使用的, 永远不要在线程里调用它."
--------------------------------------------------------------
现在知道了,以后不会这样用了,谢谢
IFindit 2004-07-19
  • 打赏
  • 举报
回复
Application.ProcessMessage的功能是中断当前程序先去执行消息队列里的消息.
必须在主进程中使用的, 永远不要在线程里调用它.
IFindit 2004-07-19
  • 打赏
  • 举报
回复
本来Synchronize(ProcessAll);后, ProcessAll部分将由主线程来执行,当主线程打开一个模态窗口时,消息阻塞在这里,主线程根本接收不到附属线程的消息. 你把Synchronize去掉,把Application.ProcessMessages也去掉应该OK
ju1 2004-07-19
  • 打赏
  • 举报
回复
看不懂 帮顶!
jlbnet 2004-07-19
  • 打赏
  • 举报
回复
to: fanshousu
ProcessAll 过程里有一个 Application.ProcessMessages;本来是想让线程在不断循环中有机会让系统去处理其他的事情,结果就在这里被挂起来了。去掉这句话以后基本正常,现在处于观察期,如果再没有出现就可以认为是这个原因了。

to: dbExpress(老枪)
谢谢关注,帮顶也有分

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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