嘰哩咕嚕

          君子如玉,上善若水

          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

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 哈密市| 双峰县| 寻乌县| 平利县| 方城县| 内丘县| 湘乡市| 汽车| 南汇区| 固镇县| 库车县| 启东市| 二连浩特市| 务川| 伊宁市| 赤城县| 白山市| 闽清县| 顺平县| 神池县| 怀安县| 台湾省| 崇州市| 鄂托克旗| 搜索| 于田县| 新沂市| 浪卡子县| 明光市| 哈密市| 新民市| 于田县| 佳木斯市| 新田县| 芮城县| 达拉特旗| 洞头县| 南安市| 宜州市| 金川县| 江川县|