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

    公告

    瘋狂

    導航

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

    統計

    常用鏈接

    留言簿

    隨筆分類(17)

    隨筆檔案(22)

    文章分類(1)

    文章檔案(1)

    工程教程

    牛人BLOG

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产免费女女脚奴视频网| 毛片在线播放免费观看| 成人免费视频观看无遮挡| 亚洲精品国产手机| 免费黄色网址网站| 亚洲粉嫩美白在线| 日韩激情无码免费毛片| 亚洲AV日韩AV无码污污网站| 男女交性永久免费视频播放| 亚洲av日韩av永久无码电影 | 亚洲性线免费观看视频成熟| 亚洲国产精品免费在线观看| 一本岛高清v不卡免费一三区| 在线亚洲午夜片AV大片| 日本高清免费不卡视频| 美女被暴羞羞免费视频| 中文字幕精品亚洲无线码一区| 少妇性饥渴无码A区免费 | 亚洲三级中文字幕| 日本免费一二区在线电影| 三级片免费观看久久| 亚洲av无码一区二区三区不卡| 91禁漫免费进入| 亚洲精品无码专区| 日韩一卡2卡3卡4卡新区亚洲| 精品无码国产污污污免费网站 | 亚洲色成人中文字幕网站| 一级毛片免费播放| 亚洲人成网站免费播放| 久久精品国产亚洲5555| 91精品国产免费入口| 精品国产日韩亚洲一区在线| 91麻豆国产自产在线观看亚洲 | 免费大片在线观看网站| 免费的全黄一级录像带| 亚洲午夜无码久久久久小说| 国产成人高清亚洲| 免费一本色道久久一区| 国产精品hd免费观看| 亚洲人成图片网站| 自拍偷自拍亚洲精品情侣|