On Thu, 11 Dec 2008, Mattias Gärtner wrote:
> Zitat von Michael Van Canneyt <[EMAIL PROTECTED]>:
>
> >
> >
> > On Thu, 11 Dec 2008, Mattias Gärtner wrote:
> >
> > > Zitat von Florian Klaempfl <[EMAIL PROTECTED]>:
> > >
> > > > Mattias Gärtner schrieb:
> > > > > I'm writing a unit to simplify parallel methods/procedures.
> > > > >
> > > > > For example:
> > > > > DoParallel(@AMethod,StartIndex,EndIndex,Data);
> > > > >
> > > > > The AMethod is executed with several threads in parallel.
> > > > >
> > > > > What should happen when an exception occurs?
> > > > > It would be nice if the exception can be transfered to the main
> > > > > thread.
> > > > > Is this possible? How?
> > > >
> > > > See synchronize/checksynchronize implementation.
> > >
> > > Sorry, I misused the term 'main thread'.
> > >
> > > DoParallel starts AMethod with several threads in parallel and waits until
> > all
> > > threads finished. DoParallel can be called by any thread (e.g. the main
> > thread
> > > of the process *or* any other sub thread). Even the threads of the pool
> > > can
> > > call again DoParallel. This is only limited by the memory, as each call
> > creates
> > > a threadgroup object.
> > >
> > > The goal is to simplify parallelizing procedures so for the user
> > > DoParallel
> > > should work like a normal procedure call.
> > > That's why it would be nice if the following could work:
> > >
> > > try
> > > ...
> > > DoParallel(...);
> > > ...
> > > except
> > > end;
> > >
> > > The exception can occur in any of the subthreads including the starting
> > thread
> > > (which I named 'main thread', because it is the main thread of the group.
> > Maybe
> > > I should call it 'group thread' or 'starter thread').
> > >
> > > When an exception occurs, the group waits for all other threads of this
> > group to
> > > finish and then the exception should happen 'as if the exception occured
> > > in
> > the
> > > starting thread'.
> >
> > The way I uderstand threads this can never work, because then there should
> > be a synchronization wait loop after the doparallel. Without the wait loop
> > it'll never work, because where (at which statement) should the exception be
> > raised ?
>
> It should be raised in the starter thread. The question is how to
> - stop an exception in a thread (try..except)
> - give it to another thread - the starter thread (giving the object is easy,
> but
> ...)
> - continue the helper thread (this will normally free the exception object, I
> need a way to avoid this automatism)
> - raise the exception in the starter thread (raise FetchedException).
This is the problem: At which point should this be done ?
Can you point at the statement where it should be raised in the following
code:
try
...
DoParallel(...);
...
except
end;
There is only 1 possible location: in a waitloop which should be after the
DoParralel. This loop must check for the exceptions...
Michael.
>
>
> > To make it operable, the thread should catch the exception, and then do a
> > synchronize with a procedure that raises the exception, so that when
> > synchronize is called, the exception is raised.
>
> I don't see how this is possible.
The whole scheme of what you try to achieve is not possible in my opinion,
because it is ill-defined.
Michael.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel