2010-01-26 74 views
4

我剛剛學習VTK(和C++ GUI編程)並希望有一個簡單的問題。來自主線程的VTK窗口線程,C++

主應用程序在應用程序的某個點啓動呈現的窗口。希望在顯示VTK窗口時能夠繼續主線程。是否有一種特殊的方法將VTK窗口作爲線程啓動?

我的環境是Linux,可以使用boost和pthreads。 謝謝。

VTK是可視化工具包,看到vtk.org

回答

2

您可以撥打vtkRenderWindowInteractor-> Start()方法。 (如果你沒有創建一個,則從渲染器獲取交互器)。

VTK包含了大量的例子;你應該看看那些!如果您沒有它們,請確保在使用cmake構建VTK時打開VTK_BUILD_EXAMPLES。

編輯:

你應該看看的GUI的例子,因爲這似乎是你正在試圖建立。

0

這是我的解決方案。希望這可以幫助!

#include <Windows.h> 
#include <iostream> 

#include <vtkVersion.h> 
#include <vtkSmartPointer.h> 
#include <vtkPolyData.h> 
#include <vtkPolyDataMapper.h> 
#include <vtkActor.h> 
#include <vtkRenderWindow.h> 
#include <vtkRenderer.h> 
#include <vtkRenderWindowInteractor.h> 
#include <vtkInteractorStyleTrackballCamera.h> 
#include <vtkSphereSource.h> 
#include <vtkElevationFilter.h> 
#include <vtkVectorText.h> 
#include <vtkCommand.h> 

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkInteractionStyle); 
VTK_MODULE_INIT(vtkRenderingOpenGL); 

#define w 400 

//---------------------------------------------o0o---------------------------------------------// 
#define VTK_CREATE(type, name) \ 
    vtkSmartPointer<type> name = vtkSmartPointer<type>::New() 
//---------------------------------------------o0o---------------------------------------------// 

using namespace std; 

void* mutex; 
void* handler_thread = 0; 

VTK_CREATE(vtkRenderer, renDisplay3D); 
VTK_CREATE(vtkRenderWindow, renderwindowDisplay3D); 
VTK_CREATE(vtkRenderWindowInteractor, irenDisplay3D); 
vtkInteractorStyleTrackballCamera *styleDisplay3D =   vtkInteractorStyleTrackballCamera::New(); 

class CommandSubclass2 : public vtkCommand 
{ 
public: 
    vtkTypeMacro(CommandSubclass2, vtkCommand); 

    static CommandSubclass2 *New() 
    { 
     return new CommandSubclass2; 
    } 

    void Execute(vtkObject *caller, unsigned long vtkNotUsed(eventId), 
     void *vtkNotUsed(callData)) 
    { 
     vtkRenderWindowInteractor *iren = static_cast<vtkRenderWindowInteractor*>(caller); 
     iren->Render(); 
    } 

}; 

unsigned long __stdcall displayVTKThread(void* param) 
{ 
    //WaitForSingleObject(mutex, INFINITE); 

    renderwindowDisplay3D->SetSize(600, 400); 
    renderwindowDisplay3D->AddRenderer(renDisplay3D); 
    renderwindowDisplay3D->Render(); 

    irenDisplay3D->SetRenderWindow(renderwindowDisplay3D); 
    irenDisplay3D->SetInteractorStyle(styleDisplay3D); 

    // Initialize must be called prior to creating timer events. 
    irenDisplay3D->Initialize(); 

    vtkSmartPointer<CommandSubclass2> timerCallback = vtkSmartPointer<CommandSubclass2>::New(); 
    irenDisplay3D->AddObserver (vtkCommand::TimerEvent, timerCallback); 

    irenDisplay3D->CreateRepeatingTimer(100); 

    irenDisplay3D->Start(); 

    //ReleaseMutex(mutex); 

    return 0; 
} 

int main (int argv, char* argc[]) 
{ 
    mutex = CreateMutex(0, false, 0); 

    unsigned long id_thread; 

    VTK_CREATE(vtkVectorText, text); 
    text->SetText("Display 3D Point Clouds!"); 
    VTK_CREATE(vtkElevationFilter, elevation); 
    elevation->SetInputConnection(text->GetOutputPort()); 
    elevation->SetLowPoint(0,0,0); 
    elevation->SetHighPoint(10,0,0); 

    // Mapper 
    VTK_CREATE(vtkPolyDataMapper, mapper); 
    mapper->SetInputConnection(elevation->GetOutputPort()); 
    mapper->Update(); 

    // Actor in scene 
    VTK_CREATE(vtkActor, actor); 
    actor->SetMapper(mapper); 

    // Add Actor to renderer 
    renDisplay3D->AddActor(actor); 
    renDisplay3D->SetBackground(0.0, 0.0, 0.0); 

    handler_thread = CreateThread(0, 0, displayVTKThread, 0, 0, &id_thread); 
    if(!handler_thread) 
    { 
     printf("Cannot create thread. Error code = %d\n", GetLastError()); 
     getchar(); 
     return -1; 
    } 

    char myChar = ' '; 
    while(myChar != 'q') { 

     myChar = getchar(); 

     if (myChar == 'v') 
     { 
      //WaitForSingleObject(mutex, INFINITE); 

      // Create a sphere 
      VTK_CREATE(vtkSphereSource, sphereSource); 
      sphereSource->SetCenter(0.0, 0.0, 0.0); 
      sphereSource->SetRadius(5.0); 

      mapper->SetInputConnection(sphereSource->GetOutputPort()); 
      actor->SetMapper(mapper); 

      renDisplay3D->ResetCamera(); 
      renDisplay3D->AddActor(actor); 

      //ReleaseMutex(mutex); 
     } 
    } 

    CloseHandle(handler_thread); 

    printf("\n\nExit program\n"); 
    Sleep(1000); 

    CloseHandle(mutex); 

    return 0; 
}