mirror of
				https://github.com/chibicitiberiu/rainmeter-studio.git
				synced 2024-02-24 04:33:31 +00:00 
			
		
		
		
	FileView: Remove use of TerminateThread
This commit is contained in:
		| @@ -43,7 +43,7 @@ typedef struct	// 22 bytes | |||||||
| } ICONDIR, *LPICONDIR; | } ICONDIR, *LPICONDIR; | ||||||
| #pragma pack(pop) | #pragma pack(pop) | ||||||
|  |  | ||||||
| unsigned __stdcall SystemThreadProc(void* pParam); | unsigned __stdcall UpdateInfoThreadProc(void* pParam); | ||||||
| void EscapeRegex(std::wstring& regex); | void EscapeRegex(std::wstring& regex); | ||||||
| void GetFolderInfo(std::queue<std::wstring>& folderQueue, std::wstring& folder, ParentMeasure* parent, RecursiveType rType); | void GetFolderInfo(std::queue<std::wstring>& folderQueue, std::wstring& folder, ParentMeasure* parent, RecursiveType rType); | ||||||
| void GetIcon(std::wstring filePath, std::wstring iconPath, IconSize iconSize); | void GetIcon(std::wstring filePath, std::wstring iconPath, IconSize iconSize); | ||||||
| @@ -297,10 +297,11 @@ PLUGIN_EXPORT double Update(void* data) | |||||||
| 	if (parent->ownerChild == child && (parent->needsUpdating || parent->needsIcons)) | 	if (parent->ownerChild == child && (parent->needsUpdating || parent->needsIcons)) | ||||||
| 	{ | 	{ | ||||||
| 		unsigned int id; | 		unsigned int id; | ||||||
| 		HANDLE thread = (HANDLE)_beginthreadex(nullptr, 0, SystemThreadProc, parent, 0, &id); | 		HANDLE thread = (HANDLE)_beginthreadex(nullptr, 0, UpdateInfoThreadProc, parent, 0, &id); | ||||||
| 		if (thread) | 		if (thread) | ||||||
| 		{ | 		{ | ||||||
| 			parent->thread = thread; | 			parent->threadActive = true; | ||||||
|  | 			CloseHandle(thread); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -489,8 +490,12 @@ PLUGIN_EXPORT void ExecuteBang(void* data, LPCWSTR args) | |||||||
| 	ChildMeasure* child = (ChildMeasure*)data; | 	ChildMeasure* child = (ChildMeasure*)data; | ||||||
| 	ParentMeasure* parent = child->parent; | 	ParentMeasure* parent = child->parent; | ||||||
|  |  | ||||||
| 	EnterCriticalSection(&g_CriticalSection); | 	if (!TryEnterCriticalSection(&g_CriticalSection)) | ||||||
| 	if (!parent || parent->thread) | 	{ | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!parent || parent->threadActive) | ||||||
| 	{ | 	{ | ||||||
| 		LeaveCriticalSection(&g_CriticalSection); | 		LeaveCriticalSection(&g_CriticalSection); | ||||||
| 		return; | 		return; | ||||||
| @@ -652,28 +657,32 @@ PLUGIN_EXPORT void Finalize(void* data) | |||||||
| 	EnterCriticalSection(&g_CriticalSection); | 	EnterCriticalSection(&g_CriticalSection); | ||||||
| 	if (parent && parent->ownerChild == child) | 	if (parent && parent->ownerChild == child) | ||||||
| 	{ | 	{ | ||||||
| 		if (parent->thread) |  | ||||||
| 		{ |  | ||||||
| 			TerminateThread(parent->thread, 0); |  | ||||||
| 			parent->thread = nullptr; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		auto iter = std::find(g_ParentMeasures.begin(), g_ParentMeasures.end(), parent); | 		auto iter = std::find(g_ParentMeasures.begin(), g_ParentMeasures.end(), parent); | ||||||
| 		g_ParentMeasures.erase(iter); | 		g_ParentMeasures.erase(iter); | ||||||
|  |  | ||||||
|  | 		if (parent->threadActive) | ||||||
|  | 		{ | ||||||
|  | 			// Increment ref count of this module so that it will not be unloaded prior to | ||||||
|  | 			// thread completion. | ||||||
|  | 			DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS; | ||||||
|  | 			HMODULE module; | ||||||
|  | 			GetModuleHandleEx(flags, (LPCWSTR)DllMain, &module); | ||||||
|  |  | ||||||
|  | 			// Thread will perform cleanup. | ||||||
|  | 			parent->threadActive = false; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
| 			delete parent; | 			delete parent; | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	delete child; | 	delete child; | ||||||
| 	LeaveCriticalSection(&g_CriticalSection); | 	LeaveCriticalSection(&g_CriticalSection); | ||||||
| } | } | ||||||
|  |  | ||||||
| unsigned __stdcall SystemThreadProc(void* pParam) | void UpdateInfo(ParentMeasure* parent) | ||||||
| { | { | ||||||
| 	CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); |  | ||||||
|  |  | ||||||
| 	ParentMeasure* parent = (ParentMeasure*)pParam; |  | ||||||
|  |  | ||||||
| 	EnterCriticalSection(&g_CriticalSection); | 	EnterCriticalSection(&g_CriticalSection); | ||||||
| 	ParentMeasure* tmp = new ParentMeasure (*parent); | 	ParentMeasure* tmp = new ParentMeasure (*parent); | ||||||
| 	parent->needsUpdating = false;						// Set to false here in case skin is reloaded | 	parent->needsUpdating = false;						// Set to false here in case skin is reloaded | ||||||
| @@ -884,19 +893,45 @@ unsigned __stdcall SystemThreadProc(void* pParam) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	EnterCriticalSection(&g_CriticalSection); |  | ||||||
| 	CloseHandle(parent->thread); |  | ||||||
| 	parent->thread = nullptr; |  | ||||||
| 	LeaveCriticalSection(&g_CriticalSection); |  | ||||||
|  |  | ||||||
| 	if (!tmp->finishAction.empty()) | 	if (!tmp->finishAction.empty()) | ||||||
| 	{ | 	{ | ||||||
| 		RmExecute(tmp->skin, tmp->finishAction.c_str()); | 		RmExecute(tmp->skin, tmp->finishAction.c_str()); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	delete tmp; | 	delete tmp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | unsigned __stdcall UpdateInfoThreadProc(void* pParam) | ||||||
|  | { | ||||||
|  | 	ParentMeasure* parent = (ParentMeasure*)pParam; | ||||||
|  |  | ||||||
|  | 	CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); | ||||||
|  |  | ||||||
|  | 	UpdateInfo(parent); | ||||||
|  |  | ||||||
| 	CoUninitialize(); | 	CoUninitialize(); | ||||||
|  |  | ||||||
|  | 	HMODULE module = NULL; | ||||||
|  |  | ||||||
|  | 	EnterCriticalSection(&g_CriticalSection); | ||||||
|  | 	if (!parent->threadActive) | ||||||
|  | 	{ | ||||||
|  | 		// Thread is not attached to an existing measure any longer, so delete | ||||||
|  | 		// unreferenced data. | ||||||
|  | 		delete parent; | ||||||
|  |  | ||||||
|  | 		DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; | ||||||
|  | 		GetModuleHandleEx(flags, (LPCWSTR)DllMain, &module); | ||||||
|  | 	} | ||||||
|  | 	LeaveCriticalSection(&g_CriticalSection); | ||||||
|  |  | ||||||
|  | 	if (module) | ||||||
|  | 	{ | ||||||
|  | 		// Decrement the ref count and possibly unload the module if this is | ||||||
|  | 		// the last instance. | ||||||
|  | 		FreeLibraryAndExitThread(module, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -112,7 +112,7 @@ struct ParentMeasure | |||||||
| 	bool needsUpdating; | 	bool needsUpdating; | ||||||
| 	bool needsIcons; | 	bool needsIcons; | ||||||
| 	int indexOffset; | 	int indexOffset; | ||||||
| 	HANDLE thread; | 	bool threadActive; | ||||||
|  |  | ||||||
| 	void* skin; | 	void* skin; | ||||||
| 	LPCWSTR name; | 	LPCWSTR name; | ||||||
| @@ -139,7 +139,7 @@ struct ParentMeasure | |||||||
| 		skin(nullptr), | 		skin(nullptr), | ||||||
| 		name(L""), | 		name(L""), | ||||||
| 		ownerChild(nullptr), | 		ownerChild(nullptr), | ||||||
| 		thread(nullptr), | 		threadActive(false), | ||||||
| 		fileCount(0), | 		fileCount(0), | ||||||
| 		folderCount(0), | 		folderCount(0), | ||||||
| 		needsUpdating(true), | 		needsUpdating(true), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Birunthan Mohanathas
					Birunthan Mohanathas