线程

线程函数就是线程创建后要执行的函数。执行线程,执行线程,说到底就是执行线程函数。这个函数是我们自定义,然后在创建线程的函数把函数名作为参数传入线程创建函数。

同理,中断线程的执行,就是中断线程函数的执行,以后再恢复线程的时候,就会在前面线程函数暂停的地方开始继续执行下面的代码。结束线程也就不再运行线程函数。线程的函数可以是一个全局函数或类的静态函数,它通常这样声明:
DWORD WINAPI ThreadProc( LPVOID lpParameter);
其中参数 lpParameter 指向要传给线程的数据,这个参数是在创建线程的时候作为参数传入线程创建函数中的。函数的返回值应该表示线程函数运行的结果:成功还是失败。注意函数名 ThreadProc 是可以是自定义的函数名,这个函数是用户先定义好,然后系统来调用的函数。

WaitForSingleObjec:
DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
参数为线程的Handle,以及相应的Timeout时间。你想无限等待下去,Timeout参数可以指定系统常量INFINITE。
有三种返回类型:
WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);
WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);
WAIT_ABANDONED 表示对象有信号,但还是不能执行 一般是因为未获取到锁或其他原因

例:

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <iostream>
using namespace std;
 
int i = 0;
DWORD WINAPI`` FunProc(LPVOID lpParameter);
 
DWORD WINAPI FunProc(LPVOID lpParameter)
{
	for (; i < 10; i++)
	{
		if (!(i % 10))
			cout << endl;
		else
			cout << i << endl;
	}
	return 0;
}
 
void main()
{
	cout << i << endl;
	HANDLE hThread;
	hThread = CreateThread(NULL, 0, FunProc, NULL, 0, NULL);
	DWORD dwRet = WaitForSingleObject(hThread, 1);
	if (dwRet == WAIT_OBJECT_0)
	{
		cout<< "创建的线程执行结束" << endl;
	}
	if (dwRet == WAIT_TIMEOUT)
	{
		cout<< "等待超时" << endl;
	}
	if (dwRet == WAIT_ABANDONED)
	{
		cout<< "Abandoned" << endl;
	}
	CloseHandle(hThread);
	system("pause");
}

在这里插入图片描述
在这里插入图片描述
上述两图都可能为结果,因为线程若能在时间片内运行完成,则会出现现象一,若不能,则会出现现象二,但是为什么线程返回了之后会后面还会继续输出呢

稍微改动后
在这里插入图片描述
发现
在这里插入图片描述
后面的数字有时候在asd2后面,表示是主线程完成的后续的执行。

线程的暂停、开始
SuspendThread(m_pthread2->m_hThread); //挂起
ResumeThread(m_pthread2->m_hThread); //开始

实例:
m_DataRecvThread->ResumeThread();//调用线程
m_SendThread->ResumeThread();
m_DataRecvThread,m_SendThread为全局变量
CWinThread* m_DataRecvThread;
即创建线程的时候的返回值
m_DataRecvThread = AfxBeginThread(DataComRecvProc, 0, THREAD_PRIORITY_BELOW_NORMAL, 0, CREATE_SUSPENDED);

另外注意CREATE_SUSPENDED表示暂时挂起,而不加
m_DataRecvThread = AfxBeginThread(DataComRecvProc, 0, THREAD_PRIORITY_BELOW_NORMAL, 0,)
表示创建并立即执行。

如果希望线程持续执行,比如我们建立一个监听线程,串口有数据时候我们进行读取,我们可以使用while中使用waitforsignlobject
当事件触发时候进行读取,读取完之后reset事件回到while的开头
继续等待。

这是另一个项目中上文的应用
UINT RecvProc(LPVOID)
{
//AfxMessageBox(“jinru Recv”);
DWORD WaitEvent = 0, Bytes = 0;
BOOL Status = FALSE;
DWORD Error;
COMSTAT cs = { 0 };
while (beTransportComIsOpen)//串口是否打开标志
{
//DWORD nResutl = WaitForSingleObject(m_hTComRecvReadyEvent, INFINITE);
WaitEvent = 0;
m_ovTWait.Offset = 0;
Status = WaitCommEvent(m_hTCom, &WaitEvent, &m_ovTWait);/
~~~~~~~~}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值