[Insight-developers] multithreading update w/example code
William A. Hoffman
bill.hoffman@kitware.com
Mon, 22 Apr 2002 21:56:07 -0400
Why not change the Win32OutputWindow to a text output window.
See itkThresholdImageFilterTest.cxx for an example.
-Bill
At 03:43 PM 4/22/2002 -0400, Miller, James V (Research) wrote:
>I think I located the Win32OutputWindow problem.
>
>Here is my current best guess.
>
>When multiple threads are being used, we create N-1 new threads
>and use the main thread as the Nth thread to split the job across.
>The Win32OutputWindow calls SendMessage() which sends a message
>to the "main" thread and waits for its response.
>
>So on a 2 processor system, the second thread sends a debug message
>to the output window and waits for it to return. The main thread
>also sends a debug message to the output window and waits for it to
>return. The problem is that the main thread is too busy waiting
>for it to handle the message to handle the message.
>
>I think we might be able to use PostMessage instead of SendMessage
>or I can change the threading code so it always starts N threads and
>does not use the main thread. The latter will require figuring out
>how to get the multi-threader code to handle the event loop AND
>wait for the threads to finish.
>
>
>-----Original Message-----
>From: Miller, James V (Research)
>Sent: Monday, April 22, 2002 3:33 PM
>To: 'Damion Shelton'; insight-developers@public.kitware.com
>Subject: RE: [Insight-developers] multithreading update w/example code
>
>
>I was able to duplicate the problem on a dual processor
>WinNT system.
>
>Here's the rub: the Win32OutputWindow is deadlocking when
>multiple threads write at the same time. This is occuring
>because you have DebugOn() on the GradientImageFilter.
>
>Turning DebugOff() on the GradientImageFilter and the program
>works fine for me.
>
>
>
>-----Original Message-----
>From: Damion Shelton [mailto:dmshelto@andrew.cmu.edu]
>Sent: Monday, April 22, 2002 1:47 PM
>To: insight-developers@public.kitware.com
>Subject: [Insight-developers] multithreading update w/example code
>
>
>Hi,
>
>In our continuing efforts to track down the multithreading weirdness with a
>dual Athlon XP machine, we've narrowed our test code down to the following
>example, which does not include any of our own code.
>
>Based on the debug output, it looks like it hangs in the gradient filter.
>By "hangs", we mean that the processor usage drops to 0% and the program
>never returns.
>
>Any ideas, please let us know. We can check this in as
>"itkMultithreadingTest" or something similar if that would be a help in
>diagnosing the problem.
>
>Thanks,
>Damion and Wilson
>
>------
>
>#include <stdio.h>
>
>// Basic ITK stuff
>#include "itkSize.h"
>#include "itkIndex.h"
>#include "itkImage.h"
>#include "itkImageRegionIterator.h"
>#include "itkPoint.h"
>#include "itkShrinkImageFilter.h"
>#include "itkGradientImageFilter.h"
>
>// Image file reading
>#include "itkImageFileReader.h"
>#include "itkMetaImageIOFactory.h"
>
>// Main for testing BloxImage/BloxPixel storage
>void main()
>{
> const unsigned int dim = 3;
>
> // Image typedef
> typedef itk::Image< unsigned char, dim > TImageType;
> typedef itk::ImageFileReader<TImageType> ImageFileReaderType;
>
> // The input file reader
> ImageFileReaderType::Pointer reader;
>
> //set up the reader and register the possible types
> reader = ImageFileReaderType::New();
> reader->DebugOn();
> itk::MetaImageIOFactory::RegisterOneFactory();
> reader->SetFileName("d:/brainweb/brainweb1.mha");
> reader->GetOutput()->SetRequestedRegionToLargestPossibleRegion();
> reader->Update();
>
> // Shrink by a factor of 2
> typedef itk::ShrinkImageFilter<TImageType, TImageType> ShrinkType;
> ShrinkType::Pointer pShrink = ShrinkType::New();
> pShrink->SetShrinkFactors(2);
> pShrink->SetInput( reader->GetOutput() );
>
> // Create a gradient filter
> typedef itk::GradientImageFilter<TImageType> TGradientFilter;
> TGradientFilter::Pointer gradFilter = TGradientFilter::New();
> gradFilter->DebugOn();
> gradFilter->SetInput( pShrink->GetOutput() );
>
> // Run the whole pipeline
> gradFilter->Update();
>
> // Get the output of the pipeline
> TGradientFilter::OutputImageType::Pointer gradOutput =
>gradFilter->GetOutput();
>}
>_______________________________________________
>Insight-developers mailing list
>Insight-developers@public.kitware.com
>http://public.kitware.com/mailman/listinfo/insight-developers
>_______________________________________________
>Insight-developers mailing list
>Insight-developers@public.kitware.com
>http://public.kitware.com/mailman/listinfo/insight-developers
>_______________________________________________
>Insight-developers mailing list
>Insight-developers@public.kitware.com
>http://public.kitware.com/mailman/listinfo/insight-developers