Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: QueueUserWorkItem wie sieht es in Delphi aus?

  Alt 17. Sep 2005, 17:57
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat