先说我一直以来的观点,不知对错。多线程的同步有三个方法,建互斥锁,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中的内容是混杂在一起的。我在函数中加了互斥量,问题才解决了,为什么是这样呢,判各位指点。
即:
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中的内容是混杂在一起的。我在函数中加了互斥量,问题才解决了,为什么是这样呢,判各位指点。
{ 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; }