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.