Use the 'FindExInfoBasic' information level on supported OS (Windows 7 and later). Should further speed-up things.
This commit is contained in:
parent
18b0993d3b
commit
17278fb7a6
@ -30,7 +30,7 @@
|
|||||||
#define VER_LAMEXP_MINOR_LO 4
|
#define VER_LAMEXP_MINOR_LO 4
|
||||||
#define VER_LAMEXP_TYPE Beta
|
#define VER_LAMEXP_TYPE Beta
|
||||||
#define VER_LAMEXP_PATCH 11
|
#define VER_LAMEXP_PATCH 11
|
||||||
#define VER_LAMEXP_BUILD 942
|
#define VER_LAMEXP_BUILD 944
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Tool versions (minimum expected versions!)
|
// Tool versions (minimum expected versions!)
|
||||||
|
@ -151,6 +151,7 @@ SIZE_T lamexp_dbg_private_bytes(void);
|
|||||||
#define LAMEXP_DELETE_ARRAY(PTR) if(PTR) { delete [] PTR; PTR = NULL; }
|
#define LAMEXP_DELETE_ARRAY(PTR) if(PTR) { delete [] PTR; PTR = NULL; }
|
||||||
#define LAMEXP_SAFE_FREE(PTR) if(PTR) { free((void*) PTR); PTR = NULL; }
|
#define LAMEXP_SAFE_FREE(PTR) if(PTR) { free((void*) PTR); PTR = NULL; }
|
||||||
#define LAMEXP_CLOSE(HANDLE) if(HANDLE != NULL && HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = NULL; }
|
#define LAMEXP_CLOSE(HANDLE) if(HANDLE != NULL && HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = NULL; }
|
||||||
|
#define LAMEXP_MIN_OS_VER(VER_INFO, VER_MAJ, VER_MIN) ((HIWORD(VER_INFO) > (VER_MAJ)) || ((HIWORD(VER_INFO) == (VER_MAJ)) && (LOWORD(VER_INFO) >= (VER_MIN))))
|
||||||
#define QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16())
|
#define QWCHAR(STR) reinterpret_cast<const wchar_t*>(STR.utf16())
|
||||||
#define WCHAR2QSTR(STR) QString::fromUtf16(reinterpret_cast<const unsigned short*>(STR))
|
#define WCHAR2QSTR(STR) QString::fromUtf16(reinterpret_cast<const unsigned short*>(STR))
|
||||||
#define LAMEXP_DYNCAST(OUT,CLASS,SRC) try { OUT = dynamic_cast<CLASS>(SRC); } catch(std::bad_cast) { OUT = NULL; }
|
#define LAMEXP_DYNCAST(OUT,CLASS,SRC) try { OUT = dynamic_cast<CLASS>(SRC); } catch(std::bad_cast) { OUT = NULL; }
|
||||||
|
@ -212,6 +212,10 @@ QModelIndex QFileSystemModelEx::index(const QString &path, int column) const
|
|||||||
QHash<const QString, bool> QFileSystemModelEx::s_hasSubfolderCache;
|
QHash<const QString, bool> QFileSystemModelEx::s_hasSubfolderCache;
|
||||||
QMutex QFileSystemModelEx::s_hasSubfolderMutex;
|
QMutex QFileSystemModelEx::s_hasSubfolderMutex;
|
||||||
|
|
||||||
|
void *QFileSystemModelEx::FindFirstFileExPtr = NULL;
|
||||||
|
bool QFileSystemModelEx::FindFirstFileExInitialized = false;
|
||||||
|
bool QFileSystemModelEx::FindFirstFileExInfoBasicOK = false;
|
||||||
|
|
||||||
bool QFileSystemModelEx::hasSubfoldersCached(const QString &path)
|
bool QFileSystemModelEx::hasSubfoldersCached(const QString &path)
|
||||||
{
|
{
|
||||||
QMutexLocker lock(&s_hasSubfolderMutex);
|
QMutexLocker lock(&s_hasSubfolderMutex);
|
||||||
@ -234,13 +238,12 @@ void QFileSystemModelEx::removeFromCache(const QString &path)
|
|||||||
|
|
||||||
bool QFileSystemModelEx::hasSubfolders(const QString &path)
|
bool QFileSystemModelEx::hasSubfolders(const QString &path)
|
||||||
{
|
{
|
||||||
static bool FindFirstFileExInitialized = false;
|
|
||||||
static FindFirstFileExFun FindFirstFileExPtr = NULL;
|
|
||||||
|
|
||||||
if(!FindFirstFileExInitialized)
|
if(!FindFirstFileExInitialized)
|
||||||
{
|
{
|
||||||
QLibrary Kernel32Lib("kernel32.dll");
|
QLibrary Kernel32Lib("kernel32.dll");
|
||||||
FindFirstFileExPtr = (FindFirstFileExFun) Kernel32Lib.resolve("FindFirstFileExW");
|
FindFirstFileExPtr = Kernel32Lib.resolve("FindFirstFileExW");
|
||||||
|
DWORD osVersionNo = lamexp_get_os_version();
|
||||||
|
FindFirstFileExInfoBasicOK = LAMEXP_MIN_OS_VER(osVersionNo, 6, 1);
|
||||||
FindFirstFileExInitialized = true;
|
FindFirstFileExInitialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,7 +251,7 @@ bool QFileSystemModelEx::hasSubfolders(const QString &path)
|
|||||||
bool bChildren = false;
|
bool bChildren = false;
|
||||||
|
|
||||||
HANDLE h = (FindFirstFileExPtr)
|
HANDLE h = (FindFirstFileExPtr)
|
||||||
? FindFirstFileExPtr(QWCHAR(QDir::toNativeSeparators(path + "/*")), FindExInfoStandard, &findData, FindExSearchLimitToDirectories, NULL, 0)
|
? reinterpret_cast<FindFirstFileExFun>(FindFirstFileExPtr)(QWCHAR(QDir::toNativeSeparators(path + "/*")), (FindFirstFileExInfoBasicOK ? FindExInfoBasic : FindExInfoStandard), &findData, FindExSearchLimitToDirectories, NULL, 0)
|
||||||
: FindFirstFileW(QWCHAR(QDir::toNativeSeparators(path + "/*")), &findData);
|
: FindFirstFileW(QWCHAR(QDir::toNativeSeparators(path + "/*")), &findData);
|
||||||
|
|
||||||
if(h != INVALID_HANDLE_VALUE)
|
if(h != INVALID_HANDLE_VALUE)
|
||||||
@ -266,5 +269,14 @@ bool QFileSystemModelEx::hasSubfolders(const QString &path)
|
|||||||
}
|
}
|
||||||
FindClose(h);
|
FindClose(h);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
if((err == ERROR_NOT_SUPPORTED) || (err == ERROR_INVALID_PARAMETER))
|
||||||
|
{
|
||||||
|
qWarning("%s failed with error code #%u", FindFirstFileExPtr ? "FindFirstFileEx" : "FindFirstFile", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return bChildren;
|
return bChildren;
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,10 @@ private:
|
|||||||
static QHash<const QString, bool> s_hasSubfolderCache;
|
static QHash<const QString, bool> s_hasSubfolderCache;
|
||||||
static QMutex s_hasSubfolderMutex;
|
static QMutex s_hasSubfolderMutex;
|
||||||
|
|
||||||
|
static void *FindFirstFileExPtr;
|
||||||
|
static bool FindFirstFileExInitialized;
|
||||||
|
static bool FindFirstFileExInfoBasicOK;
|
||||||
|
|
||||||
static bool hasSubfolders(const QString &path);
|
static bool hasSubfolders(const QString &path);
|
||||||
static bool hasSubfoldersCached(const QString &path);
|
static bool hasSubfoldersCached(const QString &path);
|
||||||
static void removeFromCache(const QString &path);
|
static void removeFromCache(const QString &path);
|
||||||
|
@ -69,7 +69,7 @@ AbstractTool::AbstractTool(void)
|
|||||||
if(m_jobObjRefCount < 1U)
|
if(m_jobObjRefCount < 1U)
|
||||||
{
|
{
|
||||||
DWORD osVersionNo = lamexp_get_os_version();
|
DWORD osVersionNo = lamexp_get_os_version();
|
||||||
if(((HIWORD(osVersionNo) == 5) && (LOWORD(osVersionNo) >= 1)) || (HIWORD(osVersionNo) > 5))
|
if(LAMEXP_MIN_OS_VER(osVersionNo, 5, 1))
|
||||||
{
|
{
|
||||||
if((!CreateJobObjectPtr) || (!SetInformationJobObjectPtr))
|
if((!CreateJobObjectPtr) || (!SetInformationJobObjectPtr))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user