Destruct AssFiles on a background thread as it's rather slow with large files

Originally committed to SVN as r6407.
This commit is contained in:
Thomas Goyne 2012-02-01 00:47:28 +00:00
parent 64553dd633
commit 8bef1eb874
2 changed files with 40 additions and 6 deletions

View File

@ -68,16 +68,14 @@ namespace std {
} }
} }
/// @brief AssFile constructor
AssFile::AssFile () AssFile::AssFile ()
: commitId(0) : commitId(0)
, loaded(false) , loaded(false)
{ {
} }
/// @brief AssFile destructor
AssFile::~AssFile() { AssFile::~AssFile() {
delete_clear(Line); background_delete_clear(Line);
} }
/// @brief Load generic subs /// @brief Load generic subs
@ -386,7 +384,7 @@ void AssFile::AddLine(wxString data, int *version, AssAttachment **attach) {
} }
void AssFile::Clear() { void AssFile::Clear() {
delete_clear(Line); background_delete_clear(Line);
loaded = false; loaded = false;
filename.clear(); filename.clear();

View File

@ -46,6 +46,7 @@
#include <wx/icon.h> #include <wx/icon.h>
#include <wx/menuitem.h> #include <wx/menuitem.h>
#include <wx/thread.h>
#endif #endif
class wxMouseEvent; class wxMouseEvent;
@ -97,18 +98,53 @@ template<typename T> inline T mid(T a, T b, T c) { return std::max(a, std::min(b
#endif #endif
#endif #endif
/// Polymorphic delete functor
struct delete_ptr { struct delete_ptr {
template<class T> template<class T>
void operator()(T* ptr) const { void operator()(T* ptr) const {
delete ptr; delete ptr;
} }
}; };
/// Delete all of the items in a container of pointers and clear the container
template<class T> template<class T>
void delete_clear(T& container) { void delete_clear(T& container) {
std::for_each(container.begin(), container.end(), delete_ptr()); if (!container.empty()) {
container.clear(); std::for_each(container.begin(), container.end(), delete_ptr());
container.clear();
}
} }
/// Helper class for background_delete_clear
template<class Container>
class BackgroundDeleter : public wxThread {
Container cont;
wxThread::ExitCode Entry() {
delete_clear(cont);
return (wxThread::ExitCode)0;
}
public:
BackgroundDeleter(Container &source)
: wxThread(wxTHREAD_DETACHED)
{
using std::swap;
swap(cont, source);
SetPriority(WXTHREAD_MIN_PRIORITY);
Create();
Run();
}
};
/// Clear a container of pointers and delete the pointed to members on a
/// background thread
template<class T>
void background_delete_clear(T& container) {
if (!container.empty())
new BackgroundDeleter<T>(container);
}
template<class Out> template<class Out>
struct cast { struct cast {
template<class In> template<class In>