Я использую стороннюю библиотеку, которая динамически загружает несколько библиотек за 60-90 секунд. Это неудачный выбор дизайна, но я не могу изменить того, кто создал их код.
Я пытаюсь использовать QSplashScreen, чтобы, по крайней мере, попросить пользователя подождать, пока я выполняю эту однократную загрузку в фоновом режиме. Проблема в том, что заставка не рисует. Я вижу окно с незакрашенным пространством, пока загружается библиотека. После этого я могу увидеть заставку, прежде чем закрыть ее.
Я просмотрел похожие вопросы (например, экран-заставка Qt не отображается), но ничего не решает моя проблема. Я попытался загрузить пустой 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
}
preLoad
? - person eyllanesc   schedule 01.11.2017qApp->processEvents();
- person eyllanesc   schedule 01.11.2017