主线程启动一个新的线程去取数据,当子线程返回的时候,如何得到子线程所采集的数据(保存在一个对象里边),如果可以麻烦个位写点简单的代码表示。
不明白如何写的地方:
1。子线程如何通知主线程来取数据
2。主线程如何获得数据
3。子线程该什么时候结束,如果要等待主线程将数据取走,使用什么样子的方式比较合适

解决方案 »

  1.   

    貌似线程的同步,给你一段示例代码:两个线程,一个线程对功能区域读,一个写,用互斥来做的,unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }  end;var
      Form1: TForm1;
      MutexHandle: THandle;
      ThreadHandle, ThreadHandle1: THandle;
      publicmem : array[0..1000] of integer;//公共区域
    implementation{$R *.DFM}function ThreadFunc1(Info: Pointer): Integer; stdcall;//线程1
    var
      ICount: Integer;
      CountStr: string;
    begin
      //用来对功能区域赋值
      if WaitForSingleObject(MutexHandle, INFINITE)= WAIT_OBJECT_0 THEN
      begin
        for ICount := 0 to 1000 do publicmem[ICount] := ICount;
        ReleaseMutex(MutexHandle);
        ExitThread(1);
      end;
    end;function ThreadFunc2(Info: Pointer): Integer; stdcall;
    var
      ICount: Integer;
      CountStr: string;
    begin
    //线程2,读公共区域
      if WaitForSingleObject(MutexHandle, INFINITE)= WAIT_OBJECT_0 then
      begin
         for ICount := 1 to 1000 do Form1.Canvas.TextOut(160, 10, 'Thread 2 ' + inttostr(publicmem[icount]));
         ReleaseMutex(MutexHandle);
         ExitThread(2);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       MutexHandle:=DWORD(-1);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      ThreadId1, ThreadId2, ThreadId3: DWORD;
    begin
      if MutexHandle<>DWORD(-1) then
         CloseHandle(MutexHandle);
      MutexHandle := CreateMutex(nil, False, 'MyMutex');
      ThreadHandle := CreateThread(nil, 0, @ThreadFunc1, nil, 0, ThreadId1);
       ThreadHandle1 := CreateThread(nil, 0, @ThreadFunc2, nil,0 , ThreadId2);end;end.
      

  2.   

    1。子线程如何通知主线程来取数据
      子线程将主线程的Handle作为引用,需要通知时,SendMessage(FParentHandle, WM_MyMsg, ...)2。主线程如何获得数据
      可以用全局变量,如上wudi_1982所说,或SendMessage的WParam, LParam参数。3。子线程该什么时候结束,如果要等待主线程将数据取走,使用什么样子的方式比较合适
      当然是主线程通知,取决你的线程,组件,逻辑设计。像TClientSocket有数据取出,你说你怎么决定将它数据取走?