我在程序中建立了一个串口通讯的工作线程,它的功能就是始终不停的读写串口,我采用的是阻塞模式读写的。但是,当我要关闭主程序时,因为这个通讯线程是个死循环,所以我在主程序中无法关掉这个线程。我不知道该怎么办?
下面是该串口线程函数主体:
====================================================================  while(1)
  {
    ……
    阻塞写串口
    阻塞读串口
    ……
  }====================================================================当主程序结束时,我现在是用 TerminateThread 函数结束线程的,但是会弹出错误对话框。请问,做过多线程通讯的朋友,有没有比较好的方法,我也知道我用的这种方法不好!

解决方案 »

  1.   

    设置一个信号量,也比如一个全局变量,工作线程间隔的检测这个量,在需要退出的时候结束循环,自然终止
    主线程在需要退出的时候设置这个信号量,然后等待工作线程退出WaitForSingleObject(线程句柄)
      

  2.   

    while(BeRun)
      {
        ……
        阻塞写串口
        阻塞读串口
        ……
      }When You Terminate the thread , set BeRun = 0
      

  3.   

    你可以考虑把你机器放到CPU比较多或者超线程的机器上尝试下,呵呵.
    都说是阻塞了,阻塞过程中肯定做不了什么事情的.
    不过两次阻塞之间可以弄个标志退出进程
    要不TerminateThread不行,就换TerminateProccess,线程改进程好了
      

  4.   

    LPCRITICAL_SECTION g_secExit;
    BOOL g_bExit=FLASE;//全局变量,
    while(1)
    {
    ……
    阻塞写串口
    阻塞读串口
    ……
    EnterCriticalSection(&g_secExit);
    if(g_bExit)
    {
      return;
    }
    LeaveCriticalSection(&g_secExit);
    }
    //////////////////////////////////
    主线程中操作g_bExit
    EnterCriticalSection(&g_secExit);
    g_bExit = TRUE;
    LeaveCriticalSection(&g_secExit);
      

  5.   

    主线程中在
    EnterCriticalSection(&g_secExit);
    g_bExit = TRUE;
    LeaveCriticalSection(&g_secExit);
    这段代码后
    最好再加上这个
    WaitForSingleObject(子线程句柄),等待子线程结束
    如果成功则安全结束子线程。
      

  6.   

    PostThreadMessage 可行,不过还是使用一个EVENT事件效率更高