linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #06574
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3208: No GUI freeze when DC++ starts
------------------------------------------------------------
revno: 3208
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Thu 2013-02-14 20:14:20 +0100
message:
No GUI freeze when DC++ starts
modified:
changelog.txt
win32/SplashWindow.cpp
win32/main.cpp
--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk
Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'changelog.txt'
--- changelog.txt 2013-02-14 16:25:20 +0000
+++ changelog.txt 2013-02-14 19:14:20 +0000
@@ -2,6 +2,7 @@
* [L#534440] [NMDC] Preserve encodings in some search results (poy)
* [ADC] Fix problems after marking oneself as a favorite user
* Display progress information when DC++ starts (poy)
+* No GUI freeze when DC++ starts (poy)
-- 0.810 2013-01-30 --
* Fix a race condition on file list download (thanks bigmuscle)
=== modified file 'win32/SplashWindow.cpp'
--- win32/SplashWindow.cpp 2013-02-14 16:25:20 +0000
+++ win32/SplashWindow.cpp 2013-02-14 19:14:20 +0000
@@ -62,12 +62,12 @@
void SplashWindow::operator()(const string& status) {
this->status = str(TF_("Loading DC++, please wait... (%1%)") % Text::toT(status));
progress = 0;
- draw();
+ callAsync([this] { draw(); });
}
void SplashWindow::operator()(float progress) {
this->progress = progress;
- draw();
+ callAsync([this] { draw(); });
}
void SplashWindow::draw() {
=== modified file 'win32/main.cpp'
--- win32/main.cpp 2013-02-14 16:25:20 +0000
+++ win32/main.cpp 2013-02-14 19:14:20 +0000
@@ -32,8 +32,10 @@
#include <dcpp/MerkleTree.h>
#include <dcpp/File.h>
#include <dcpp/Text.h>
+#include <dcpp/Thread.h>
#include <dcpp/MappingManager.h>
#include <dcpp/ResourceManager.h>
+#include <dcpp/version.h>
#include <dwt/Application.h>
@@ -138,25 +140,38 @@
startup();
PluginApiWin::init();
- load([splash](const string& str) { (*splash)(str); }, [splash](float progress) { (*splash)(progress); });
-
- bindtextdomain(PACKAGE, LOCALEDIR);
- textdomain(PACKAGE);
-
- if(ResourceManager::getInstance()->isRTL()) {
- SetProcessDefaultLayout(LAYOUT_RTL);
- }
-
- dwtTexts::init();
-
- WinUtil::init();
-
- MainWindow* wnd = new MainWindow;
- WinUtil::mainWindow = wnd;
- //WinUtil::mdiParent = wnd->getMDIParent();
-
- splash->close();
-
+ // load in a separate thread to avoid freezing the GUI thread.
+ struct Loader : Thread {
+ Loader(SplashWindow& splash) : Thread(), splash(splash) { }
+ int run() {
+ load([this](const string& str) { this->splash(str); }, [this](float progress) { this->splash(progress); });
+
+ splash(Text::fromT(_T(APPNAME)));
+
+ dwt::Application::instance().callAsync([this] {
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+
+ if(ResourceManager::getInstance()->isRTL()) {
+ SetProcessDefaultLayout(LAYOUT_RTL);
+ }
+
+ dwtTexts::init();
+
+ WinUtil::init();
+
+ MainWindow* wnd = new MainWindow;
+ WinUtil::mainWindow = wnd;
+ //WinUtil::mdiParent = wnd->getMDIParent();
+
+ this->splash.close();
+ });
+ return 0;
+ }
+ SplashWindow& splash;
+ } loader { *splash };
+
+ loader.start();
app.run();
} catch(const std::exception& e) {