Beispiel #1
0
#include "ThreadWrapperBase.h"
#include "NativeExceptionBase.h"

#using <System.Windows.Forms.dll>

namespace ThreadManager
{
	ThreadWrapperBase::ThreadWrapperBase()
	{
		actionQueue = gcnew Queue<ActionItem^>();
		actionQueueLock = gcnew Object();
		doActionsLock = gcnew Object();
		terminated = gcnew ManualResetEvent(false);
		waitLock = gcnew ManualResetEvent(false);
		delegateDictionary = gcnew Dictionary<String^, Delegate^>();
		CreateThread();
	}

	void ThreadWrapperBase::StartThread(Object^ startArg)
	{
		thread->Start(startArg);
	}

	void ThreadWrapperBase::TerminateThread()
	{
		// set "terminated" to indicate we want to finish the thread
		if (terminated)
			terminated->Set();

		waitLock->Set();
//---------------------------------------------------------------------------
// DiskAsyncResult Constructor (internal)
//
// Arguments:
//
//	handle		- Open DiskSafeHandle instance
//	state		- IAsyncResult state object

DiskAsyncResult::DiskAsyncResult(DiskSafeHandle^ handle, Object^ state) : 
	m_handle(handle), m_state(state), m_completed(false)
{
	// Can't check this
	// if(handle == nullptr) throw gcnew ArgumentNullException("handle");

	m_event = gcnew ManualResetEvent(false);
	m_overlapped = gcnew Overlapped(0, 0, m_event->SafeWaitHandle->DangerousGetHandle(), this);
	m_pNativeOverlapped = m_overlapped->Pack(nullptr, nullptr);
}

//---------------------------------------------------------------------------
// DiskAsyncResult Finalizer

DiskAsyncResult::!DiskAsyncResult()
{
	if(m_pNativeOverlapped) Overlapped::Free(m_pNativeOverlapped);
	m_pNativeOverlapped = NULL;
}

//---------------------------------------------------------------------------
// DiskAsyncResult::EndOperation (internal, static)