ITK Image to VTK Image conversion issue

I am using ImageToVTKImageFilter to convert ITKImage to VTKImage with the following code:

typedef itk::ImageToVTKImageFilter ConverterType;  
typename ConverterType::Pointer converter = ConverterType::New();  
converter->SetInput(image);  
converter->Update();  
converter->UpdateOutputInformation();

The Update() function is a blocking call that takes 2-3 seconds to complete. During this time, my Qt UI freezes because Update() blocks the main thread responsible for UI rendering.

To address this, I tried moving the Update() call to a separate thread using QThread and also attempted to trigger Update() with a timer. Unfortunately, both methods not worked out.

Has anyone encountered a similar issue or have recommendations for avoiding UI thread blocking? I want the image conversion to occur asynchronously without freezing the UI. Any assistance would be greatly appreciated!

Hello,

I imagine you want to animate some kind of progress bar or some other visual feedback to the user the process is going on. In my program I do this during a large data file load, in the client code:

    // data load takes place in another thread, so we can show and update a progress bar
    //////////////////////////////////
    QProgressDialog progressDialog;
    progressDialog.show();
    progressDialog.setLabelText("Loading and parsing " + _path + "...");
    progressDialog.setMinimum(0);
    progressDialog.setValue(0);
    progressDialog.setMaximum(getFileSize() / 100); // see DataLoader::doLoad(). Dividing
                                                    // by 100 allows a max value of ~400GB
                                                    // when converting from long to int
    QThread *thread = new QThread(); // does it need to set parent (a QObject)?
    DataLoader *dl = new DataLoader(file, _data, data_line_count, _dataPageFirstLine,
                                    _dataPageLastLine); // Do not set a parent. The object
                                                        // cannot be moved if it has a
                                                        // parent.
    dl->moveToThread(thread);
    dl->connect(thread, SIGNAL(finished()), dl, SLOT(deleteLater()));
    dl->connect(thread, SIGNAL(started()), dl, SLOT(doLoad()));
    dl->connect(dl, SIGNAL(progress(int)), &progressDialog, SLOT(setValue(int)));
	thread->start();
    /////////////////////////////////

    // wait for the data load to finish
    // not very beautiful, but simple and effective
    while (!dl->isFinished()) {
        thread->wait(200); // reduces cpu usage, refreshes at each 500 milliseconds
        QCoreApplication::processEvents(); // let Qt repaint widgets
    }

The DataLoader class is here: gammaray/domain/auxiliary/dataloader.h at master · PauloCarvalhoRJ/gammaray · GitHub and gammaray/domain/auxiliary/dataloader.cpp at master · PauloCarvalhoRJ/gammaray · GitHub . I think you can taylor the code to suit your need.

I hope this helps,

PC