如何正確給CreateThread傳遞參數

來源:互聯網
上載者:User

   在網上我們也可以找到相關例子,不過用的是Delphi的TThread類,我個人不太愛用,一個線程也弄

的那麼麻煩,不過各有各的好處,這裡就不談論Delphi的TThread類了,我們以線上程裡運行MessageBoxA

顯示一對話方塊為例(也就是線程MessageBoxA)。

我們先看看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,這是我們控制線程必須的。

ThreadProc函數定義:
Function ThreadProc(lpParameter:Pointer):DWORD;stdcall;

下面給出具體執行個體:
因為我們要線上程裡執行MessageBoxA所以線程函數可以這樣寫:

Function ThreadProc(lpParameter:Pointer):DWORD;stdcall;
var
 h:hmodule;
 MyMessagebox:function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;stdcall;
begin
 result:=0;
 h:=LoadLibrary('user32.dll');
 if h>0 then
 begin
  @MyMessagebox:=GetProcAddress(h,'MessageBoxA');
  if @MyMessagebox<>nil then
  MyMessageBox(0 ,'線程MessageBoxA測試','提示',0);
  freeLibrary(h);
 end;
end;
建立線程:
createthread(nil,0,@ThreadProc,p,0,TheThread);

上面我們動態調用了MessageBoxA並顯示資訊,這樣就出現了問題,因為我們不可能每顯示一個

MessageBoxA訊息都要手動定義一個ThreadProc過程,那麼我們如何做呢,就是利用lpParameter參數傳遞
lpParameter是指標類型,而MessageBoxA最主要的兩個參數是Title和Msg,因此我們可以定義自己的結構
type
 MYPARA=record
  title:pchar;
  str:pchar;
 end;
PMYPARA=^MYPARA;
這樣我們的ThreadProc過程就可以這樣寫
Function ThreadProc(Para:PMYPARA):DWORD;stdcall;
var
 h:hmodule;
 MyMessagebox:function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;stdcall;
begin
 result:=0;
 h:=LoadLibrary('user32.dll');
 if h>0 then
 begin
  @MyMessagebox:=GetProcAddress(h,'MessageBoxA');
  if @MyMessagebox<>nil then
  MyMessageBox(0 ,Para^.str,Para^.title,0);
  freeLibrary(h);
 end;
end;

建立線程可以這樣:
var
  P:PMYPARA;
  ThreadHandle: THandle;
  TheThread: DWORD;
begin
  getmem(p,sizeof(p));//分配記憶體
  ThreadHandle:=0;
try
  p.title:='測試';    //填充
  p.str:='線程MessageBoxA';
  ThreadHandle:=createthread(nil,0,@ThreadProc,p,0,TheThread);
finally
  if ThreadHandle<>0 then closehandle(ThreadHandle);
  if p<>nil then freemem(p);
end;

至此一個完整的帶有參數的CreateThread就完成了,希望對你有所協助。
如有錯誤請指教。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.