Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Selbstgebauter Threadpool funktioniert nicht

  Alt 11. Mär 2009, 16:07
Delphi-Quellcode:
procedure TThreadPool.AddJob(AJob: TObject);
begin
  PostQueuedCompletionStatus(FIOComPort,1,Cardinal(AJob),nil);
end;

procedure TThreadPool.Dead;
var i: Integer;
begin
  for i:=1 to FThreads.Count do
    PostQueuedCompletionStatus(FIOComPort,0,0,nil); //"Beenden"-Nachricht schicken
end;

procedure TThreadPoolThread.GetJob;
var bytes: Cardinal;
    over: POverlapped;
    AJob: Cardinal;
begin
  if not GetQueuedCompletionStatus(FIOComPort,bytes,AJob,over,INFINITE) then //!!
    RaiseLastOsError;
  if bytes = 0 then
    Dead
  else
    FJob := TObject(AJob);
end;

procedure TThreadPoolThread.Execute;
begin
  while True do
  begin
    GetJob;
    if FDead then
      Exit;
    if (Assigned(FOnWork)) and (Assigned(FJob)) then
      FOnWork(Self,FJob);
  end;
end;
So pollt wenigstens der Threadpool nicht mehr.

Warum bist du so masochistisch, dich mit der Unit Sockets anzulegen? Da bist du doch schneller, indem du direkt die Windows-Funktionen benutzt. Schau dir mal die Unit ScktComp an: Da wird gezeigt, wie man ohne zusätzliche Threads über die Winsockets kommunizieren kann. Da gibt es nämlich auch Möglichkeiten, ereignisgesteuert zu arbeiten.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat