At 25.11.2010 19:57, Jonas Maebe wrote:
On 25 Nov 2010, at 13:21, Jonas Maebe wrote:
On 25 Nov 2010, at 12:24, Anton Kavalenka wrote:
What I have to do to properly initialize these defaults for new threads AFTER
capturing StdOut?
Store a copy of your stdout in a global variable, and after creating a new
thread
close(stdout);
stdout:=myglobalstdout;
(and maybe the same for "output").
Actually, that won't work because the different threads will then work on a
common buffer but with distinct pointers into it. A better solution is probably
to do this in the intialisation code of each thread instead:
{$ifdef unix}
fpclose(ttextrec(stdout).handle);
{$elsif defined(MSWINDOWS)}
{ this is a copy of do_close() from the rtl, I don't know whether
a new handle from a thread can actually have any of these values }
if (handle<> StdInputHandle) and
(handle<> StdOutputHandle) and
(handle<> StdErrorHandle) then
CloseHandle(ttextrec(stdout).handle);
{$else}
{$error Add support for this platform}
{$endif}
ttextrec(stdout).handle:=myglobalstdouthandle;
Jonas_______________________________________________
fpc-devel maillist -fpc-de...@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel
That's unsuitable. I have lots of modules and lost of threads. Many
modules built with C++ runtime, others with C.
Output goes from many places and many threads.
The task is to do inside process what the UNIX tee command does outside.
regards,
Anton
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel