嘰哩咕嚕

          君子如玉,上善若水

          Delphi CreateThread 創建多線程的寫法

          function CreateThread(lpThreadAttributes: Pointer;
                                dwStackSize: DWORD;
                                lpStartAddress: TFNThreadStartRoutine;
                                lpParameter: Pointer;
                                dwCreationFlags: DWORD;
                                var lpThreadId: DWORD): THandle; stdcall;

          其中lpStartAddress,lpParameter,lpThreadId三個參數是必須的。
          lpStartAddress參數指向的是線程執行體ThreadProc的開始地址;
          lpParameter指針類型,線程的傳入參數,我們如果想給線程執行體ThreadProc傳遞我們自己的數據,
                     就要通過它了;
          lpThreadId返回創建線程ID,這是我們控制線程必須的。



          主要說lpStartAddress和lpParameter這兩個參數..
          lpStartAddress主開始的地址.說明這是個指針.一般傳一個方法的地址進去.. 也就是我們要執行的一段代碼.
          lpParameter就是參數.我們自己要執行的方法肯定會有參數的. 一般都是傳一個Record類型的指針.

          下面復制一個我的Demo例子:

          unit CreateThreadFrm;

          interface

          uses
            Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
            Dialogs, StdCtrls;
          type
            MyParam = record    //線程的時候傳遞
              str:string;
            end;
            PMyParam=^MyParam; //Record類型指針
             procedure CallAgent(msg: PMyParam);stdcall;  //這個方法聲明為什么要放在這里就可以,放在類TForm1里面就不行.
          type
            TForm1 = class(TForm)
              Button1: TButton;
              procedure Button1Click(Sender: TObject);


            private
              { Private declarations }
            public
              { Public declarations }
            end;

          var
            Form1: TForm1;

          implementation

          {$R *.dfm}

          {
          發送消息給消息彈出代理程序   POPAgent.exe
          DDZ
          2010年8月28日14:44:36
          }

          procedure TForm1.Button1Click(Sender: TObject);
          var
            PMyPara:PMyParam;
            MyPara:MyParam;
            Cthread: THandle;   //線程句柄
            Tid: DWord;
          begin
            new(PMyPara) ;   //另外這里還有一個問題,這里只New開辟類型,并沒有FreeMem會不會漏了
            PMyPara.str := 'h太低發出來';
            Cthread:=CreateThread(nil,0,@CallAgent,PMyPara,0,Tid); //創建一個線程,同時調用線程函數
          end;

          procedure CallAgent(msg: PMyParam);stdcall;
          var
            HlAgent:HWND;
            ds:TCopyDatastruct;
            AgentMsg:string;
          begin
           
            //showmessage(msg^.str);
            AgentMsg := msg.str;
            //Application.ProcessMessages;
            ds.cbData := Length(AgentMsg)+1;
            GetMem(ds.lpData,ds.cbData); //分配內存
            StrCopy(ds.lpData,PChar(AgentMsg)); //復制值到指針

            HlAgent :=FindWindow('TmsgpopMainCaller','調用者');
            if  HlAgent <> 0 then
            begin
              SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds));
            end;
            FreeMem(ds.lpData); //釋放內存  這里要釋放, 上面的Record記錄要不要釋放 呢.我這樣寫會報錯的
          end;

          end.



          看這個例子可以參考   CreateThread 函數與.線程間的通信方法.這兩個技術點.








          posted on 2010-09-01 14:46 嘰哩咕嚕 閱讀(9447) 評論(0)  編輯  收藏 所屬分類: 個人總結

          公告

          瘋狂

          導航

          <2010年9月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統計

          常用鏈接

          留言簿

          隨筆分類(17)

          隨筆檔案(22)

          文章分類(1)

          文章檔案(1)

          工程教程

          牛人BLOG

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 衡阳县| 逊克县| 封丘县| 衡山县| 兴业县| 平乡县| 正蓝旗| 嘉荫县| 寻乌县| 连云港市| 五大连池市| 余干县| 如皋市| 蒲城县| 浦江县| 全州县| 华蓥市| 高青县| 阳新县| 凌海市| 合江县| 阿荣旗| 蓬莱市| 汝南县| 上栗县| 定兴县| 垦利县| 禹州市| 开阳县| 恩平市| 清水河县| 遵化市| 甘德县| 万宁市| 和平县| 汉源县| 孝感市| 崇义县| 岳阳县| 汉阴县| 唐河县|