我正在使用第三方库,它需要 60-90 秒才能动态加载多个库。这是一个不幸的设计选择,但我不能改变谁构建了他们的代码。
我正在尝试使用 QSplashScreen 至少告诉用户在我在后台执行此一次性加载时等待。问题是启动画面没有绘画。加载库时,我可以看到一个未绘制空间的窗口。之后我可以在关闭它之前看到启动画面。
我查看了类似的问题(例如Qt Splash Screen not shown),但似乎没有任何问题可以解决我的问题。我试过加载一个空的 QPixmap 并给它一个纯色。这也没有出现。
QApplication a(argc, argv);
QPixmap pxl("icon.bmp");
QSplashScreen qss(pxl);
qss.show();
qss.showMessage(QString::fromStdString("Please wait... Loading"));
a.processEvents();
MainWindow w;
//thread is blocked
w.preLoad();//this is where the lengthy process takes place
w.show();
qss.finish(&w);
我想确保在开始加载过程之前它至少绘制一次。
- - - - - - - - - - - - 编辑 - - - - - - - - - - - - - ------
让我重申对 preLoad 的调用正在阻塞线程。这不是一个选择。我已经为该过程尝试了一个单独的线程。我也尝试过为启动画面使用单独的线程(打开它,然后在另一个线程完成时完成)。我尝试在两个线程之间使用信号量来完成此操作,虽然一切正常(包括启动屏幕),但加载需要 200-800 秒。这根本是不可接受的。因此,我想从这个角度看看它周围是否有距离。
-------------------------最终解决方案------------------------ ---------
多亏了下面的评论,我才意识到 Qt 有自己的线程功能。我看到的所有问题似乎都是由 std::thread 和 Qt 自己的实现的相互作用引起的。
我有一个可行的部分解决方案。它不像它可能的那样整洁,但我想将它包含在问题线程中。
//in the main method code described above
MainWindow w;
w.preLoad();
while(w.IsLoading())
{
//waiting on semaphore signaling loading is complete
//this part could probably be done better with QThread
//and signals, but it is a quick fix for now
std::this_thread::sleepfor(std::chrono::milliseconds(500));
a.processEvents();
}
w.show();
qss.finish(&w);
//In the MainWindow class
void MainWindow::preLoad()
{
loading=true;//semaphore to stall main thread
QFuture<void> future = QtConcurrent::run(this, &MainWindow::LongMethod);
}
void MainWindow::LongMethod()
{
thirdPartyLibrary.impossibleCall();
loading=false;//this handles my semaphore
}