Как визуализировать вычисления, выполняющиеся в другом потоке в реальном времени с помощью vtk - PullRequest
4 голосов
/ 02 июня 2011

Я хотел бы визуализировать текущие вычисления в другом потоке с помощью набора инструментов визуализации в реальном времени. Расчет выдает новый набор значений для визуализации на каждой итерации, и графический поток должен каким-то образом это знать и загружать новые значения.

Один из способов сделать это - опросить основной поток о состоянии вычислений. В идеале я не хотел бы делать какие-либо опросы, но если нет другого пути, я это сделаю.

Лучший способ, о котором я могу подумать, - это заставить поток вычислений помещать событие в очередь событий основного потока на каждой итерации вычисления, которое затем обрабатывается GUI. Я не уверен, как это сделать, или если это можно сделать потокобезопасным способом.

Я использую vtk в gcc / C ++ в Linux, используя pthreads.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Прослушивание события Modified на интересующем вас объекте в основном потоке с использованием vtkCommand (или соответствующего производного класса).Затем вы можете обновить ваш рендерер и связанные классы при возникновении обратного вызова.

Но многие классы VTK не являются поточно-ориентированными.Вам нужно будет приостановить обновление во время рендеринга.В противном случае он будет зависать при попытке чтения и записи в одну и ту же память.

1 голос
/ 03 июня 2011

Я думаю, что это стандартный способ.Создайте отдельный поток для обработки окна (т.е. обработки сообщений окна) и иногда помещайте данные в окно (т.е. обновляйте изображение).

Аналогичная процедура с MathGL выглядит следующим образом (см. Как я могу создать окно FLTK / GLUT / Qt параллельно с расчетом? )

//-----------------------------------------------------------------------------
#include <mgl/mgl_fltk.h>
#include <pthread.h>
#include <unistd.h>

mglPoint pnt;  // some global variable for changable data
//-----------------------------------------------------------------------------
int sample(mglGraph *gr, void *)
{
  gr->Box();  gr->Line(mglPoint(),pnt,"Ar2"); // just draw a vector
  return 0;
}
//-----------------------------------------------------------------------------
void *mgl_fltk_tmp(void *)      {       mglFlRun();     return 0;       }
int main (int argc, char ** argv)
{
  mglGraphFLTK gr;
  gr.Window(argc,argv,sample,"test");  // create window
  static pthread_t tmp;
  pthread_create(&tmp, 0, mgl_fltk_tmp, 0);
  pthread_detach(tmp);    // run window handling in the separate thread
  for(int i=0;i<10;i++)   // do calculation
  {
    sleep(1);             // which can be very long
    pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);
    gr.Update();          // update window
  }
  return 0;   // finish calculations and close the window
}
//-----------------------------------------------------------------------------
...