我在做一个数据采集程序,想用两个线程来做,一个Thread1负责接收数据,另一个thread2负责把接收到的数据画到tchart上,数据保存在全局数组里,现在我碰到了如何将协调这两个线程的难题,我的逻辑是在thread1把数据接收进来保存到数组后,通知thread2,让它把刚才接收到的数据画出来,画好后,再通知thread1,让它继续把接收到的数据放到全局数组里来。请问一下,该怎么办好?如果单用CS感觉不行。

解决方案 »

  1.   

    你用一个线程接收数据并存到数组中,然后用另一个线程读数组数据画tchart,个人感觉这样并不能提高性能,反而增加了传递参数,互斥访问,线程同步等额外开销。 
      如果真的要用两个线程实现的话,可以把数组看成一个临界资源,让各线程对数组进行互斥(我习惯说互斥,好多资料说同步)访问,具体是用信号量,临界区进行同步就看你的选择了。
      个人认为此问题还是单线程解决比较好。仅供参考^-^!
      

  2.   

    to ylvb()
    呵呵,你好,感觉你说的挺有道理的,不过如果用多线程的话,感觉你那个方法不行哦,因为时序还是控制不了阿。不过我现在也在想用单线程来解决,能说说你的想法(关于单线程解决)吗?
      

  3.   

    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.
      

  4.   

    通过信号量,临界区等同步方法保证时序应不成问题(见楼上).
    如果单线程的话就相对简单了.你一定也想到了,线程中做以下三步就ok了:
    1.接收数据到数组
    2.从数组中读数据画tchart//如果可以的话直接读进来就画曲线,数组就免了.
    3.回到1.
    另外:如果你接收数据的速率过高的话,在允许的范围内就要对接收数据要有所取舍了,不取舍的话,事实性就不强了.