我写了一个简单的程序 用于演示多线程并发运行及逐个关闭
但是在我调试中发现 即使我在线程一关闭之后 仍在执行
在线等待 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",&params.iFrequenceOfHonk);
printf("\n Enter the duration of beeps to produce: ");
scanf("%d",&params.iDurationOfHonk);
printf("\n Enter the number of beeps to produce: ");
scanf("%d",&params.numberOfHonk);
printf("\n 子线程二参数输入: ");
printf("\n Enter the frequence of beeps to produce: ");
scanf("%d",&params1.iFrequenceOfHonk);
printf("\n Enter the duration of beeps to produce: ");
scanf("%d",&params1.iDurationOfHonk);
printf("\n Enter the number of beeps to produce: ");
scanf("%d",&params1.numberOfHonk);//把HonkThread()函数创建为线程
honkHandle=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HonkThread, (VOID *)&params, 0, &threadID);
//第4个参数用于传递蜂鸣属性。因为API要求传递的是参数变量的指针,所以使用取址运算符"&"
//因为API要求,第4个参数传递时,使用(VOID *),把参数指针强制转换为无类型指针。
honkHandle1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HonkThread, (VOID *)&params1, 0, &threadID1);
//下面的任务与蜂鸣任务并发进行
printf("\n控制子线程关闭的主线程已触发!");
Sleep(5000);
printf("\n子线程一关闭");
CloseHandle(honkHandle);
Sleep(5000);
printf("\n子线程二关闭");
CloseHandle(honkHandle1);
//销毁句柄honkHandle对应的线程。
}

解决方案 »

  1.   

    可以使用
    TerminateThread(honkHandle) 或者
    ExitThread(honkHandle)
    强行退出了,但是可能会造成无响应。你为啥不用AfxBeginThread函数创建线程呢?这个可以直接用AfxEndThread退出
      

  2.   

    CloseHandle跟关闭线程是两回事情,强行的关闭会导致一系列不可测的行为以及Memeory leak的发生.
    修改一下,通过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 *)&params, 0, &threadID);        //Signal close event
    SetHandle(params.stopEvent);
    //Wait thread handle signaled
    WaitForSingleObject(m_hThread, INFINITE);
    //Close thread handle
            CloseHandle(honkHandle);
    return 0;
    }