请指点一下,讨论也可以,顶也有分

lijinghe1 2006-12-06 09:19:17
先说我一直以来的观点,不知对错。

多线程的同步有三个方法,建互斥锁,Synchronize和消息。前两个我不说了,只说消息。

我作的消息同步就是把需要同步的操作放到主窗体的消息响应事件中。
即:
procedure TfrmMain.DO_USERMSG(var Message: TMessage); message WM_USERMSG;
begin
//do something
end;

每个线程在满足条件时会给主窗体发消息。

这样DO_USERMSG函数是在主线程中执行的函数,应该不存在并发问题。但是实际上不是这样的,比如把函数改为:

procedure TfrmMain.DO_USERMSG(var Message: TMessage); message WM_USERMSG;
begin
Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));

Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
end;

Memo1中的内容是混杂在一起的。

我在函数中加了互斥量,问题才解决了,为什么是这样呢,判各位指点。
...全文
172 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
王集鹄 2006-12-06
  • 打赏
  • 举报
回复
发送消息的时候用PostMessage不用SendMessage
tiger186520 2006-12-06
  • 打赏
  • 举报
回复
晕,这样的问题才叫基础问题?
harshing 2006-12-06
  • 打赏
  • 举报
回复
不是并发,但是memo处理的响应速度不及时,导致看起来像并发,界面完成一个消息的工作是需要时间的,不然Delphi的线程也不会有这段提示了:
{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure xxxx.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
lijinghe1 2006-12-06
  • 打赏
  • 举报
回复
我不理解的主要是DO_USERMSG函数好像是并发执行的。
ZyxIp 2006-12-06
  • 打赏
  • 举报
回复
同步还有临界区的方式,但只能用在同步同一个进程的多个线程,但它的速度最快,占用资源最少。

天涯倦客 2006-12-06
  • 打赏
  • 举报
回复
帮顶 消息是队列。。。
ZyxIp 2006-12-06
  • 打赏
  • 举报
回复
线程的消息同步不是WIN系统的Postmessage 或 SendMessage

《WINDOWS核心编程》仔细看看,绝对值得购买。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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