Vielen Dank für eure Hinweise.
Ich denke, auch xcopy, robocopy und Kollegen kochen nur mit Wasser
Ich habe jetzt etwas mehr Intelligenz in die Read/Write Threads verlagert und kann jetzt mit dem Code im Main-Thread leben.
Delphi-Quellcode:
while ( rest > 0 ) and ( Len > 0 ) do begin
if ( read1.xBuf1Ready = 1 ) and ( write1.xBuf1Ready = 0 ) and ( write2.xBuf1Ready = 0 ) then begin
len := read1.xLen1Read;
rest := rest - len;
write1.xLen1Read := Len;
write2.xLen1Read := Len;
write1.xBuf1Ready := 1; // Start write 1 Buffer 1
write2.xBuf1Ready := 1; // Start write 2 Buffer 1
read1.xBuf1Ready := 2; // Buf1 wird geschrieben
dbg( 'RUN rest ' + intToStr( ( Rest div 1024 div 1024 ) ) + 'MB Buffer ' + intToStr( ( Len div 1024 div 1024 ) ) + 'MB');
end;
if ( read1.xBuf2Ready = 1 ) and ( write1.xBuf2Ready = 0 ) and ( write2.xBuf2Ready = 0 ) then begin
len := read1.xLen2Read;
rest := rest - len;
write1.xLen2Read := Len;
write2.xLen2Read := Len;
write1.xBuf2Ready := 1; // Start write 1 Buffer 2
write2.xBuf2Ready := 1; // Start write 2 Buffer 2
read1.xBuf2Ready := 2; // Buf2 wird geschrieben
dbg( 'RUN rest ' + intToStr( ( Rest div 1024 div 1024 ) ) + 'MB Buffer ' + intToStr( ( Len div 1024 div 1024 ) ) + 'MB');
end;
if ( read1.xBuf1Ready = 2 ) and ( write1.xBuf1Ready = 0 ) and ( write2.xBuf1Ready = 0 ) then read1.xBuf1Ready := 0; // Freigabe Read Buffer 1
if ( read1.xBuf2Ready = 2 ) and ( write1.xBuf2Ready = 0 ) and ( write2.xBuf2Ready = 0 ) then read1.xBuf2Ready := 0; // Freigabe Read Buffer 2
sleep(1);
end; // While end
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.