我想知道如何將物件的本地物件地址TStrings(在堆上分配,IIRC)從呼叫函式傳遞給我用CreateThread(). 執行緒有一個無限等待,所以物件在呼叫者級別應該仍然可用,等待被資訊填充。
我想保持這個 Win32 相關,而不是使用 VCLTThread類來處理這些東西。
有沒有人有如何做到這一點的例子?在API 呼叫之前IsMutliThread已設定為。我只想利用將變數的地址直接傳遞給作業執行緒。TrueCreateThread()TStrings
uj5u.com熱心網友回復:
首先,IsMutliThread對 沒有影響CreateThread()。
其次,對于這種確切的情況CreateThread()有一個引數。lpParameter它是一個 untyped Pointer,所以你可以將任何你想要的東西傳遞給你的執行緒函式。在這種情況下,你可以簡單地傳遞區域變數的值,TStrings你不需要傳遞區域變數的地址,例如:
function MyThreadProc(lpParameter: Pointer): DWORD; stdcall;
var
List: TStrings;
begin
List := TStrings(lpParameter);
// populate List as needed...
Result := 0;
end;
...
var
List: TStrings;
H: THandle;
TID: DWORD;
begin
List := TStringList.Create;
try
H := CreateThread(nil, 0, @MyThreadProc, List, 0, TID);
if H = 0 then RaiseLastOSError;
WaitForSingleObject(H, INFINITE);
CloseHandle(H);
// use List as needed...
finally
List.Free;
end;
end;
話雖如此,創建一個作業執行緒只是為了立即等待它終止是對作業執行緒的浪費。在這種情況下,您也可以完全洗掉作業執行緒并直接呼叫執行緒函式并等待它回傳,最終結果將完全相同 - 呼叫者等待直到TStrings填充 - 例如:
procedure MyProc(List: TStrings);
begin
// populate List as needed...
end;
...
var
List: TStrings;
begin
List := TStringList.Create;
try
MyProc(List);
// use List as needed...
finally
List.Free;
end;
end;
uj5u.com熱心網友回復:
您應該使用內部BeginThread呼叫的獨立于平臺的函式CreateThread。
這是一個例子
https://www.delphibasics.co.uk/RTL.php?Name=BeginThread
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/509898.html
