OK, ich habs jetzt. Mein Beispielprogramm sieht jetzt so aus:
Delphi-Quellcode:
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
i: Cardinal;
public
{ Public declarations }
end;
type
TThreadParams = record
ThreadID: Cardinal;
end;
PThreadParams = ^TThreadParams;
var
Form1 : TForm1;
function QueueUserWorkItem(LPTHREAD_START_ROUTINE: Pointer; Context: Pointer; Flags: DWORD): DWORD; stdcall; external
'kernel32.dll';
const
WT_EXECUTEDEFAULT = $00000000;
WT_EXECUTEINIOTHREAD = $00000001;
WT_EXECUTEINUITHREAD = $00000002;
WT_EXECUTEINWAITTHREAD = $00000004;
WT_EXECUTEONLYONCE = $00000008;
WT_EXECUTEINTIMERTHREAD = $00000020;
WT_EXECUTELONGFUNCTION = $00000010;
WT_EXECUTEINPERSISTENTIOTHREAD = $00000040;
WT_EXECUTEINPERSISTENTTHREAD = $00000080;
WT_TRANSFER_IMPERSONATION = $00000100;
implementation
{$R *.dfm}
function Thread(p: Pointer): Integer;
var
hWnd: THandle;
ThreadID: Cardinal;
begin
ThreadID := PThreadParams(p)^.ThreadID;
Messagebox(0, PChar(IntToStr(ThreadID)), '', 0);
Dispose(p);
result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadParams: PThreadParams;
begin
New(ThreadParams);
ThreadParams.ThreadID := i;
if QueueUserWorkItem(@Thread, ThreadParams, WT_EXECUTEONLYONCE) = 0 then
ShowMessage(SysErrorMessage(GetLastError));
Inc(i);
end;
Allerdings habe ich da noch ein Verständnisproblem oder so:
Ich klicke einmal, ich bomme die Messagebox null, ich klicke ein zweites mal, ich bekomme die Messagebox eins, ich klicke ein drittes mal, es passiert nichts, ich klicke ein viertes mal, es passiert nichts, ich klicke ein fünftes mal, ich bekomme die Messagebox drei. Entsprechd wird auch nur die Anzahl der Threads im Taskmanager erhöht. Aber sollte es nicht so sein, dass
bei jedem Aufruf von
QueueUserWorkItem ein Thread erzeugt wird? Oder wie soll das funktionieren?