我剛剛學習VTK(和C++ GUI編程)並希望有一個簡單的問題。來自主線程的VTK窗口線程,C++
主應用程序在應用程序的某個點啓動呈現的窗口。希望在顯示VTK窗口時能夠繼續主線程。是否有一種特殊的方法將VTK窗口作爲線程啓動?
我的環境是Linux,可以使用boost和pthreads。 謝謝。
VTK是可視化工具包,看到vtk.org
我剛剛學習VTK(和C++ GUI編程)並希望有一個簡單的問題。來自主線程的VTK窗口線程,C++
主應用程序在應用程序的某個點啓動呈現的窗口。希望在顯示VTK窗口時能夠繼續主線程。是否有一種特殊的方法將VTK窗口作爲線程啓動?
我的環境是Linux,可以使用boost和pthreads。 謝謝。
VTK是可視化工具包,看到vtk.org
您可以撥打vtkRenderWindowInteractor-> Start()方法。 (如果你沒有創建一個,則從渲染器獲取交互器)。
VTK包含了大量的例子;你應該看看那些!如果您沒有它們,請確保在使用cmake構建VTK時打開VTK_BUILD_EXAMPLES。
編輯:
你應該看看的GUI的例子,因爲這似乎是你正在試圖建立。
這是我的解決方案。希望這可以幫助!
#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;
}