关于在串口接收时多线程同步的问题? 我在做一个数据采集程序,想用两个线程来做,一个Thread1负责接收数据,另一个thread2负责把接收到的数据画到tchart上,数据保存在全局数组里,现在我碰到了如何将协调这两个线程的难题,我的逻辑是在thread1把数据接收进来保存到数组后,通知thread2,让它把刚才接收到的数据画出来,画好后,再通知thread1,让它继续把接收到的数据放到全局数组里来。请问一下,该怎么办好?如果单用CS感觉不行。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你用一个线程接收数据并存到数组中,然后用另一个线程读数组数据画tchart,个人感觉这样并不能提高性能,反而增加了传递参数,互斥访问,线程同步等额外开销。 如果真的要用两个线程实现的话,可以把数组看成一个临界资源,让各线程对数组进行互斥(我习惯说互斥,好多资料说同步)访问,具体是用信号量,临界区进行同步就看你的选择了。 个人认为此问题还是单线程解决比较好。仅供参考^-^! to ylvb()呵呵,你好,感觉你说的挺有道理的,不过如果用多线程的话,感觉你那个方法不行哦,因为时序还是控制不了阿。不过我现在也在想用单线程来解决,能说说你的想法(关于单线程解决)吗? unit Unit2;interfaceuses Windows,SysUtils,Classes,SyncObjs;type TWriteThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; TReadThread = class(TThread) protected procedure Execute; override; end;var Lock : TCriticalSection; ReadCompleted,WriteCompleted : TSimpleEvent;implementationuses Unit1;procedure TWriteThread.Execute;var WaitForRead : TWaitResult;begin Self.FreeOnTerminate := False; while not self.Terminated do begin //开始写数据 Lock.Enter; Sleep(500); Lock.Leave; //完成写数据 WriteCompleted.SetEvent; //等待完成读数据 WaitForRead := ReadCompleted.WaitFor(INFINITE); if WaitForRead<>wrSignaled then Break; ReadCompleted.ResetEvent; form1.memo1.Lines.Add(DateTimeToStr(Now)+'写完了'); end;end;{ TReadThread }procedure TReadThread.Execute;var WaitForWrite : TWaitResult;begin Self.FreeOnTerminate := False; While Not Self.Terminated do begin //等待完成写 WaitForWrite := WriteCompleted.WaitFor(INFINITE); if WaitForWrite<>wrSignaled then Break; WriteCompleted.ResetEvent; //开始读 Lock.Enter; Sleep(500); Lock.Leave; //完成读取 ReadCompleted.SetEvent; form1.memo1.Lines.Add(DateTimeToStr(Now)+'读完了'); end;end;end. 通过信号量,临界区等同步方法保证时序应不成问题(见楼上).如果单线程的话就相对简单了.你一定也想到了,线程中做以下三步就ok了:1.接收数据到数组2.从数组中读数据画tchart//如果可以的话直接读进来就画曲线,数组就免了.3.回到1.另外:如果你接收数据的速率过高的话,在允许的范围内就要对接收数据要有所取舍了,不取舍的话,事实性就不强了. Delphi翻译成C# 很简短 大家帮下忙 关于指针的问题,请教高人, ◎◎◎★★★●○●○●○【 散分(1) 】○●○●○●★★★◎◎◎ 如何实现让一个程序在一运行就自己运行同一目录下的另一程序,并最小化第二个程序 送分了!好久没用有好多分了。一个简单问题。 请问在哪个国外网站可以发布共享软件?谢谢![email protected] 关于工资管理的问题???? 怎样用ADO与数据仓库(Decision Cube)进行连接,或DBChart、Chart进行连接? 两次执行循环问题? 我有个access的库,想存pdf进去,再读出来。字段该怎么建,怎么读写,谢谢 文件内容读取 组件的事件问题
如果真的要用两个线程实现的话,可以把数组看成一个临界资源,让各线程对数组进行互斥(我习惯说互斥,好多资料说同步)访问,具体是用信号量,临界区进行同步就看你的选择了。
个人认为此问题还是单线程解决比较好。仅供参考^-^!
呵呵,你好,感觉你说的挺有道理的,不过如果用多线程的话,感觉你那个方法不行哦,因为时序还是控制不了阿。不过我现在也在想用单线程来解决,能说说你的想法(关于单线程解决)吗?
Windows,SysUtils,Classes,SyncObjs;type
TWriteThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end; TReadThread = class(TThread)
protected
procedure Execute; override;
end;var
Lock : TCriticalSection;
ReadCompleted,WriteCompleted : TSimpleEvent;implementationuses Unit1;procedure TWriteThread.Execute;
var
WaitForRead : TWaitResult;
begin
Self.FreeOnTerminate := False;
while not self.Terminated do
begin
//开始写数据
Lock.Enter;
Sleep(500);
Lock.Leave; //完成写数据
WriteCompleted.SetEvent; //等待完成读数据
WaitForRead := ReadCompleted.WaitFor(INFINITE);
if WaitForRead<>wrSignaled then
Break;
ReadCompleted.ResetEvent;
form1.memo1.Lines.Add(DateTimeToStr(Now)+'写完了');
end;
end;{ TReadThread }procedure TReadThread.Execute;
var
WaitForWrite : TWaitResult;
begin
Self.FreeOnTerminate := False;
While Not Self.Terminated do
begin
//等待完成写
WaitForWrite := WriteCompleted.WaitFor(INFINITE);
if WaitForWrite<>wrSignaled then
Break;
WriteCompleted.ResetEvent; //开始读
Lock.Enter;
Sleep(500);
Lock.Leave;
//完成读取
ReadCompleted.SetEvent;
form1.memo1.Lines.Add(DateTimeToStr(Now)+'读完了');
end;
end;end.
如果单线程的话就相对简单了.你一定也想到了,线程中做以下三步就ok了:
1.接收数据到数组
2.从数组中读数据画tchart//如果可以的话直接读进来就画曲线,数组就免了.
3.回到1.
另外:如果你接收数据的速率过高的话,在允许的范围内就要对接收数据要有所取舍了,不取舍的话,事实性就不强了.