如何设置自定义堆栈大小TThread?我正在尝试重新引入构造函数,TThread但是它表示它ThreadProc已经缺失但它的权利在那里System.Classes.
type
TThreadHelper = class helper for TThread
constructor Create(const CreateSuspended: Boolean = False; const StackSize: Integer = 0); reintroduce;
end;
{ TThreadHelper }
constructor TThreadHelper.Create(const CreateSuspended: Boolean; const StackSize: Integer);
begin
Self.FSuspended := not Self.FExternalThread;
Self.FCreateSuspended := CreateSuspended and not Self.FExternalThread;
if not Self.FExternalThread then
begin
Self.FHandle := BeginThread(nil, StackSize, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, Self.FThreadID);
if Self.FHandle = 0 then
raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
end
else
begin
Self.FHandle := Winapi.Windows.GetCurrentThread;
Self.FThreadId := GetCurrentThreadId;
end;
end;
Run Code Online (Sandbox Code Playgroud)
[dcc32错误] Project5.dpr(29):E2003未声明的标识符:'ThreadProc'
我不知道,如果你可以在创建一个线程后设置堆栈大小.也许SetThreadStackGuarantee可以有所帮助?
您可以通过使用从头创建一个线程BeginThread,但它非常复杂.我在这里使用了一个解决方法Detours.请注意,有几种Detours变体.我认为只有Cromis.Detoursx64兼容.
unit IndividualStackSizeForThread;
interface
uses
System.Classes,
Cromis.Detours { http://www.cromis.net/blog/downloads/cromis-ipc/ };
type
TThreadHelper = class helper for TThread
constructor Create(CreateSuspended: Boolean; StackSize: LongWord);
end;
implementation
var
TrampolineBeginThread: function(SecurityAttributes: Pointer; StackSize: LongWord;
ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
var ThreadId: TThreadID): THandle = nil;
threadvar
StackSizeOverride: LongWord;
function InterceptBeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
var ThreadId: TThreadID): THandle;
const
STACK_SIZE_PARAM_IS_A_RESERVATION = $00010000; // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx
begin
if StackSizeOverride <> 0 then
begin
CreationFlags := CreationFlags or STACK_SIZE_PARAM_IS_A_RESERVATION;
StackSize := StackSizeOverride;
StackSizeOverride := 0;
end;
Result := TrampolineBeginThread(SecurityAttributes, StackSize, ThreadFunc,
Parameter, CreationFlags, ThreadId);
end;
constructor TThreadHelper.Create(CreateSuspended: Boolean; StackSize: LongWord);
begin
StackSizeOverride := StackSize;
inherited Create(CreateSuspended);
end;
initialization
TrampolineBeginThread := InterceptCreate(@BeginThread, @InterceptBeginThread);
finalization
InterceptRemove(@TrampolineBeginThread, @InterceptBeginThread);
end.
Run Code Online (Sandbox Code Playgroud)
我不知道为什么Embt不允许程序员指定堆栈大小,如果有人知道原因,那对我来说会非常有趣.
| 归档时间: |
|
| 查看次数: |
1173 次 |
| 最近记录: |