<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    嘰哩咕嚕

    君子如玉,上善若水

    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 嘰哩咕嚕 閱讀(9442) 評論(0)  編輯  收藏 所屬分類: 個人總結

    公告

    瘋狂

    導航

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

    統計

    常用鏈接

    留言簿

    隨筆分類(17)

    隨筆檔案(22)

    文章分類(1)

    文章檔案(1)

    工程教程

    牛人BLOG

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国内精品免费在线观看| 成人性生交大片免费看无遮挡| 亚洲人成在线观看| 国产人在线成免费视频| 免费高清A级毛片在线播放| 亚洲欧洲日产国码久在线观看| 我想看一级毛片免费的| 国产久爱免费精品视频| 亚洲妇女水蜜桃av网网站| 亚洲?V无码成人精品区日韩| 18禁黄网站禁片免费观看不卡| 国产亚洲视频在线播放大全| 久久国产亚洲观看| 香蕉视频在线观看免费国产婷婷| 男女作爱在线播放免费网站| 含羞草国产亚洲精品岁国产精品| 亚洲人成网77777亚洲色| 日本免费观看网站| 中文字幕视频免费| eeuss影院ss奇兵免费com| 99久久婷婷国产综合亚洲| 亚洲国产婷婷六月丁香| 永久中文字幕免费视频网站| 中文字幕成人免费视频| 一级特黄录像免费播放肥| 亚洲精品无码专区| 亚洲网站在线免费观看| 亚洲午夜久久久影院| 五月天婷亚洲天综合网精品偷| 99久久免费国产精品特黄| 69av免费观看| 最近免费中文字幕中文高清| 粉色视频成年免费人15次| www.亚洲成在线| 久久久亚洲欧洲日产国码是AV| 国产亚洲精品a在线观看app| 亚洲国产精品激情在线观看| 破了亲妺妺的处免费视频国产| 99久久这里只精品国产免费| 国产h肉在线视频免费观看| 久久久久国色av免费看|