Обновление компонента Windows Form с его дескриптором вне основного потока пользовательского интерфейса?

Я задал вопрос о своей проблеме, и я добился некоторого прогресса. Я отправляю дескриптор компонента PictureBox в свой метод VolumeRender, метод VolumeRender связывает компонент PictureBox с vtkRenderWindow, обрабатывает конвейер и обновляет renderWindow. Хорошо, этот процесс выполняется вне потока пользовательского интерфейса, но проблема в том, что как только поток объемного рендеринга выходит за рамки, поток пользовательского интерфейса, я не знаю почему, освобождает компонент pictureBox. Вот коды;

private: System::Void volumeRenderButton_Click(System::Object^  sender, System::EventArgs^  e) 
{
    volumeRenderThread = gcnew System::Threading::Thread(
        gcnew System::Threading::ThreadStart(this, &Form1::volumeRender));
        volumeRenderThread->Start(threeDPictureBox->Handle);
}

private: void volumeRender( System::Object ^obj )
{               
     IntPtr ^ptr = (IntPtr ^) obj;
     dicom->VolumeRender((HWND)(ptr->ToPointer()), vrSettings);     
}

void Dicom::VolumeRender(HWND pictureBoxHandle, VRsettings *settings )
{
    renderer = vtkSmartPointer < vtkRenderer > :: New();
    renderWindow = vtkSmartPointer < vtkWin32OpenGLRenderWindow > :: New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetParentId(pictureBoxHandle);
    renderWindow->SetSize(settings->width, settings->height);
    renderWindow->Initialize();

    iren = vtkSmartPointer < vtkWin32RenderWindowInteractor > :: New();
    iren->SetRenderWindow(renderWindow);

    /* Volume Render Pipeline 
    ...
    ...
    */

    renderWindow->Render();
    iren->Initialize();
}

Я уверен, что проблема не связана с VTK. При отладке кода, после выполнения оператора renderWindow->Render(), в основной форме визуализированное изображение видно на компоненте pictureBox, но после того, как поток volumeRender выходит за пределы области видимости, threeDPictureBox каким-то образом освобождается. Спасибо за ответы! действительно нужна помощь


person anarhikos    schedule 17.05.2011    source источник
comment
Документы VTK не очень хороши. Но они нигде не упоминают, что он поддерживает рендеринг из другого потока. Что означает, что это не так.   -  person Hans Passant    schedule 17.05.2011
comment
Как вы думаете, проблема связана с VTK? Я плохо разбираюсь в .NET framework. Правильно ли я поступаю в .NET?   -  person anarhikos    schedule 17.05.2011
comment
Нет, это твой код. Вы не можете использовать поток для рендеринга.   -  person Hans Passant    schedule 17.05.2011
comment
Должен ли я отображать его в основном потоке, чтобы заморозить приложение? это плохая идея   -  person anarhikos    schedule 17.05.2011
comment
Рендеринг в буфер, затем отправка буфера в основной поток.   -  person Peter Davis    schedule 30.05.2011