如何正確給CreateThread傳遞參數?

文章標題:如何正確給CreateThread傳遞參數?
文章作者:JJony
文章來源:http://blog.csdn.net/jzj_jony

在網上我們也可以找到相關例子,不過用的是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就完成了,希望對你有所幫助。
如有錯誤請指教。

 
發佈了19 篇原創文章 · 獲贊 3 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章