我写了一个简单的程序 用于演示多线程并发运行及逐个关闭
但是在我调试中发现 即使我在线程一关闭之后 仍在执行
在线等待 QQ 392581208typedef struct //这个数据结构用于封装蜂鸣属性的参数
{
int iFrequenceOfHonk;
int iDurationOfHonk;
int numberOfHonk;
} HonkParamsType;/////////////////////////////////////////////////////////////////////////////
// 本函数准备创建为线程
void HonkThread(HonkParamsType *paramsk)
{
int i;for (i=0; i < paramsk->numberOfHonk; i++)
{
Beep(paramsk->iFrequenceOfHonk, paramsk->iDurationOfHonk); //蜂鸣一声
Sleep(1000); //延时1秒
}
}/////////////////////////////////////////////////////////////////////////////
// main()函数将被操作系统创建为tttt.exe进程的主线程
void main(void)
{
HANDLE honkHandle; //HANDLE是WinAPI定义的句柄类型。句柄变量honkHandle是API调用需要的。
DWORD threadID; //DWORD类型参见注释2。变量threadID暂不研究
HANDLE honkHandle1; //HANDLE是WinAPI定义的句柄类型。句柄变量honkHandle是API调用需要的。
DWORD threadID1; //DWORD类型参见注释2。变量threadID暂不研究
HonkParamsType params; //定义蜂鸣属性的参数变量,是一个结构型变量
HonkParamsType params1;
printf("\n 子线程一参数输入: ");
printf("\n Enter the frequence of beeps to produce: ");
scanf("%d",¶ms.iFrequenceOfHonk);
printf("\n Enter the duration of beeps to produce: ");
scanf("%d",¶ms.iDurationOfHonk);
printf("\n Enter the number of beeps to produce: ");
scanf("%d",¶ms.numberOfHonk);
printf("\n 子线程二参数输入: ");
printf("\n Enter the frequence of beeps to produce: ");
scanf("%d",¶ms1.iFrequenceOfHonk);
printf("\n Enter the duration of beeps to produce: ");
scanf("%d",¶ms1.iDurationOfHonk);
printf("\n Enter the number of beeps to produce: ");
scanf("%d",¶ms1.numberOfHonk);//把HonkThread()函数创建为线程
honkHandle=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HonkThread, (VOID *)¶ms, 0, &threadID);
//第4个参数用于传递蜂鸣属性。因为API要求传递的是参数变量的指针,所以使用取址运算符"&"
//因为API要求,第4个参数传递时,使用(VOID *),把参数指针强制转换为无类型指针。
honkHandle1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HonkThread, (VOID *)¶ms1, 0, &threadID1);
//下面的任务与蜂鸣任务并发进行
printf("\n控制子线程关闭的主线程已触发!");
Sleep(5000);
printf("\n子线程一关闭");
CloseHandle(honkHandle);
Sleep(5000);
printf("\n子线程二关闭");
CloseHandle(honkHandle1);
//销毁句柄honkHandle对应的线程。
}
但是在我调试中发现 即使我在线程一关闭之后 仍在执行
在线等待 QQ 392581208typedef struct //这个数据结构用于封装蜂鸣属性的参数
{
int iFrequenceOfHonk;
int iDurationOfHonk;
int numberOfHonk;
} HonkParamsType;/////////////////////////////////////////////////////////////////////////////
// 本函数准备创建为线程
void HonkThread(HonkParamsType *paramsk)
{
int i;for (i=0; i < paramsk->numberOfHonk; i++)
{
Beep(paramsk->iFrequenceOfHonk, paramsk->iDurationOfHonk); //蜂鸣一声
Sleep(1000); //延时1秒
}
}/////////////////////////////////////////////////////////////////////////////
// main()函数将被操作系统创建为tttt.exe进程的主线程
void main(void)
{
HANDLE honkHandle; //HANDLE是WinAPI定义的句柄类型。句柄变量honkHandle是API调用需要的。
DWORD threadID; //DWORD类型参见注释2。变量threadID暂不研究
HANDLE honkHandle1; //HANDLE是WinAPI定义的句柄类型。句柄变量honkHandle是API调用需要的。
DWORD threadID1; //DWORD类型参见注释2。变量threadID暂不研究
HonkParamsType params; //定义蜂鸣属性的参数变量,是一个结构型变量
HonkParamsType params1;
printf("\n 子线程一参数输入: ");
printf("\n Enter the frequence of beeps to produce: ");
scanf("%d",¶ms.iFrequenceOfHonk);
printf("\n Enter the duration of beeps to produce: ");
scanf("%d",¶ms.iDurationOfHonk);
printf("\n Enter the number of beeps to produce: ");
scanf("%d",¶ms.numberOfHonk);
printf("\n 子线程二参数输入: ");
printf("\n Enter the frequence of beeps to produce: ");
scanf("%d",¶ms1.iFrequenceOfHonk);
printf("\n Enter the duration of beeps to produce: ");
scanf("%d",¶ms1.iDurationOfHonk);
printf("\n Enter the number of beeps to produce: ");
scanf("%d",¶ms1.numberOfHonk);//把HonkThread()函数创建为线程
honkHandle=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HonkThread, (VOID *)¶ms, 0, &threadID);
//第4个参数用于传递蜂鸣属性。因为API要求传递的是参数变量的指针,所以使用取址运算符"&"
//因为API要求,第4个参数传递时,使用(VOID *),把参数指针强制转换为无类型指针。
honkHandle1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HonkThread, (VOID *)¶ms1, 0, &threadID1);
//下面的任务与蜂鸣任务并发进行
printf("\n控制子线程关闭的主线程已触发!");
Sleep(5000);
printf("\n子线程一关闭");
CloseHandle(honkHandle);
Sleep(5000);
printf("\n子线程二关闭");
CloseHandle(honkHandle1);
//销毁句柄honkHandle对应的线程。
}
TerminateThread(honkHandle) 或者
ExitThread(honkHandle)
强行退出了,但是可能会造成无响应。你为啥不用AfxBeginThread函数创建线程呢?这个可以直接用AfxEndThread退出
修改一下,通过Event控制来安全关闭线程typedef struct //这个数据结构用于封装蜂鸣属性的参数
{
int iFrequenceOfHonk;
int iDurationOfHonk;
int numberOfHonk;
HANDLE stopEvent;
} HonkParamsType;void HonkThread(HonkParamsType *paramsk)
{
int i; for (i=0; i < paramsk->numberOfHonk; i++)
{
//Wait stop requirement
if (WaitForSingleObject(paramsk->stopEvent, 0) != WAIT_TIMEOUT)
{
return;
}
Beep(paramsk->iFrequenceOfHonk, paramsk->iDurationOfHonk); //蜂鸣一声
Sleep(1000); //延时1秒
}
}int main(int argc, char *argv[])
{
//以上代码是省略
HonkParamsType params;
params.stopEvent =CreateEvent(NULL, TRUE, FALSE, NULL);
honkHandle=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HonkThread, (VOID *)¶ms, 0, &threadID); //Signal close event
SetHandle(params.stopEvent);
//Wait thread handle signaled
WaitForSingleObject(m_hThread, INFINITE);
//Close thread handle
CloseHandle(honkHandle);
return 0;
}