Test--Thread

void CTestThreadDlg::OnBnClickedButtonStart()
{
	// TODO: 在此添加控件通知处理程序代码
	if(!m_bStart)
	{
		m_bStart = TRUE;
		SetTimer(0, 100, NULL);
		m_ButtonStart.SetWindowTextW(_T("Stop"));

		g_start = TRUE;
		g_hThread = CreateThread(NULL, 0, WorkThread, m_hWnd, 0, &g_tid);
		if(g_hThread == NULL)
		{
			MessageBox(NULL, _T("Thread creation failed!"), MB_OK|MB_ICONERROR);
		}else
		{
			TRACE(_T("Thread [%08X] begin\r\n"), g_tid);
		}

	}
	else
	{
		KillTimer(0);
		m_bStart = FALSE;
		m_ButtonStart.SetWindowTextW(_T("Start"));
		
		if(g_hThread)
		{
			g_start = FALSE;
			DWORD ret = WaitForSingleObject(g_hThread, 5000);
			if (ret == WAIT_TIMEOUT)
			{
				MessageBox(NULL, _T("Timed out waiting for work thread to end."), MB_ICONERROR | MB_OK);
				TerminateThread(g_hThread, -1);
				CloseHandle(g_hThread);
				g_hThread = NULL;
			}
			else
			{
				TRACE(_T("Thread [%08X] end\r\n"), g_tid);
				CloseHandle(g_hThread);
				g_hThread = NULL;

			}
		}
	}
}

void CTestThreadDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//if(0)
	if(m_bStart)
	if(nIDEvent==0)//my-timer
	{
		TRACE(_T("OnTimer: locking\r\n"));
		CSingleLock lock(&g_mutex);
	
		UINT loop = 0;
		while(!lock.Lock(50))
		{
				MSG msg;
				GetMessage(&msg, NULL, 0, 0);
				//TranslateMessage(&msg);
				//DispatchMessage(&msg);
				//Sleep(10);
				if(++loop >= 100)
				{
					break;
				}
		}

		//lock.Lock();
		if(lock.IsLocked())
		{
			TRACE(_T("OnTimer: locked\r\n"));
			g_tick++;

			//m_ListBox.AddString(_T("OnTimer Locked"));
			//m_ListBox.SetCurSel(g_tick-1);
			//Sleep(300);



			CString s;
			s.Format(_T("OnTimer #%d"), g_tick);
			m_ListBox.AddString(s);
			m_ListBox.SetCurSel(g_tick-1);
			s.Format(_T("OnTimer #%d\r\n"), g_tick-1);

			TRACE(_T("OnTimer: un-locking\r\n"));
			lock.Unlock();
			TRACE(_T("OnTimer: un-locked\r\n"));
		}
		else
		{
			TRACE(_T("OnTimer: lock failed\r\n"));
		}

		//TRACE(s);
		
	}

	CDialog::OnTimer(nIDEvent);
}

void CTestThreadDlg::OnDestroy()
{
	CDialog::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	//if(m_bStart)
	{
		m_bStart = FALSE;
		KillTimer(0);
	}

	m_ButtonStart.SetWindowTextW(_T("Start"));
		
	if(g_hThread)
	{
		g_start = FALSE;
		DWORD ret = WaitForSingleObject(g_hThread, 5000);
		if (ret == WAIT_TIMEOUT)
		{
			MessageBox(NULL, _T("Timed out waiting for work thread to end."), MB_ICONERROR | MB_OK);
			TerminateThread(g_hThread, 0xff);
			CloseHandle(g_hThread);
			g_hThread = NULL;
		}
		else
		{
			TRACE(_T("Thread [%08X] end\r\n"), g_tid);
			CloseHandle(g_hThread);
			g_hThread = NULL;
		}
	}
}

DWORD _stdcall WorkThread(void *param)
{
	UINT tick = 0;
	CString s;
	HWND hwnd_parent = (HWND)param;
	
	while(g_start)
	{
		TRACE(_T("Thread: locking\r\n"));
		CSingleLock lock(&g_mutex);
		lock.Lock();
		if(lock.IsLocked())
		{
			TRACE(_T("Thread: locked\r\n"));
			g_tick++;
			//char * str = (char*)malloc(101);
			//memset(str, 0, 101);
			//sprintf_s(str, 100, ("WorkThread: #%d"), g_tick);

			CString s;
			s.Format(_T("WorkThread: #%d"), g_tick);
			LPCTSTR wps = (LPCTSTR)s;
			WCHAR* newps = (WCHAR*)malloc(100);
			wcscpy_s(newps, 40, wps);
			/*
			WCHAR *a = __T(str);
			
			WCHAR  *ps = (WCHAR*)malloc(101);
			int size = sizeof(WCHAR)*101;
			memset(ps, 0, 101);
			*/
			
			TRACE(_T("Thread: sleeping\r\n"));
			Sleep(500);
			
			TRACE(_T("Thread: un-locking\r\n"));
			lock.Unlock();
			TRACE(_T("Thread: un-locked\r\n"));

			//PostMessage(hwnd_parent, UMSG_WORK_DATA, (WPARAM)str, 0);
			SendMessage(hwnd_parent, UMSG_WORK_DATA, (WPARAM)newps, 0);
		}
		else
		{
			TRACE(_T("Thread: lock failed\r\n"));
		}

		Sleep(1000);
	}
	return 0;
}

BOOL CTestThreadDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if(pMsg->message == UMSG_WORK_DATA)
	{
		char *buf = (char*)(pMsg->wParam);
		TRACE(buf);
		TRACE("\r\n");
		free(buf);
		buf = NULL;
		return TRUE;
	}

	return CDialog::PreTranslateMessage(pMsg);
}

LRESULT CTestThreadDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: 在此添加专用代码和/或调用基类
	if(message == UMSG_WORK_DATA)
	{
		LPCTSTR buf = (LPCTSTR)(wParam);
		m_ListBox.AddString(buf);
		TRACE(buf);
		TRACE("\r\n");
		free((void*)buf);
		buf = NULL;
	}

	return CDialog::WindowProc(message, wParam, lParam);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值