[vtkusers] Serious(?) flaws in vtk code
William A. Hoffman
billlist at nycap.rr.com
Wed Mar 10 09:13:14 EST 2004
Where is Project_vtkDemo? Can it be fixed so other people
do not run into this problem?
-Bill
At 12:32 PM 3/9/2004, Xianjin Yang wrote:
>Dear all,
>
>I have been using BCB6 + VTK 4.2 and had similar problems before.
>To solve Access violation problem related to DummyCritSect.Lock() in the destructor of vtkPolyData (~vtkPolyData), I did these in the Project_vtkDemo:
>
>1) Remove everything in the FormDestroy event handler.
>2) Add this FormClose event handler. All problems should be gone!!
>
>void __fastcall TVTK_Form::FormClose(TObject *Sender, TCloseAction &Action)
>{
> if (shrink) shrink->Delete();
> vtkTimerLog::DeallocateTimerLog();
> vtkWindow1->GetRenderer()->RemoveAllProps();
> // VTK_Form->Release();
> // Application->Terminate();
>}
>I am not sure if the last two lines of code are required in BCB6.
>
>vtkTimerLog::DeallocateTimerLog() is a fix discussed here:
><http://public.kitware.com/pipermail/vtkusers/2003-August/019522.html>http://public.kitware.com/pipermail/vtkusers/2003-August/019522.html
>
>Xianjin Yang, Ph.D.
>
>
>
>-----Original Message-----
>From: William A. Hoffman [<mailto:billlist at nycap.rr.com>mailto:billlist at nycap.rr.com]
>Sent: Tuesday, March 09, 2004 10:18 AM
>To: Per Dalgas Jakobsen; vtkusers at vtk.org
>Subject: Re: [vtkusers] Serious(?) flaws in vtk code
>
>I have not looked at the BCB Windows code, however,
>it seems that you might be able to move the creation/destruction
>of the vtk objects to a different spot. There must be some method
>that is called to initialize the BCB objects, and another one
>to destroy them. You could go to some sort of lazy create if
>there is no such method. Basically, the first time the vtk object
>is used, then create the vtk object. Then when your window gets the close event, destroy the vtk object, don't just create and destroy the vtk objects in the constructor/destructor of the BCB object. All vtk objects should be created after main, and deleted before the end of main, and you should have no problem.
>
>-Bill
>
>At 04:19 AM 3/9/2004, Per Dalgas Jakobsen wrote:
>>Hi all,
>>
>>I believe I have found some flaws in the vtk code.
>>I think most vtk users are not affected, but us poor souls that are
>>forced to use Borland C++ Builder (BCB) are affected.
>
>>The problem reveals itself the following way (in my case at least):
>>Access violation in the destructor of vtkPolyData (~vtkPolyData) - The
>>DummyCritSect.Lock() call fails.
>>
>>The cause is that DummyCritSect, in certain cases, has already been
>>destroyed. In other words: ~vtkPolyData is calling a method in an
>>object that is no longer in existence.
>>
>>Explanation:
>>DummyCritSect is a "nonlocal" object which is created before main() is
>>executed, and destroyed after main() has returned. This is actually
>>what is intended, and quite nice, except when used from within (but not
>>exclusively) BCB...
>>
>>The problem is that the Visual Component Library (VCL), which is the
>>foundation of BCB, also seems to be created from a "nonlocal" object.
>>This means that BCB Windows and DummyCritSect are created at the same
>>point, and destroyed at the same point, but the sequence is undefined.
>>
>>According to "The C++ Programming Language" by Bjarne Stroustrup:
>>-------
>>Section 10.4.9 Nonlocal store:
>>
>>1) "A variable defined outside any function (that is, global,
>>namespace, and class static variables; §C.9) is initialized
>>(constructed) before main() is invoked, and any such variable that has
>>been constructed will have its destructor invoked after exit from
>>main()."
>>
>>2) "No implementation-independent guarantees are made about the order
>>of construction of nonlocal objects in different compilation units."
>>
>>3) "The order of destruction is similarly implementation-dependent."
>>-------
>>
>>This means that IF vtk is accessed from a "nonlocal" object, it is
>>implementation-dependent wether it works or not. In case of BCB, it
>>doesn't :-(
>>
>>As long as you are not making components containing vtk-code in BCB, it
>>is possible to make workarounds, but it seems to be impossible to get
>>component-wrapped vtk-code to work correctly.
>>
>>
>>How do we get around this problem?
>>I don't think that we should "#ifdef __BORLANDC__" our way out of the
>>BCB problem, this will leave the code flawed for projects using
>>nonlocal objects. Any thoughts?
>>
>>
>>Best regards
>>Per
>>
More information about the vtkusers
mailing list