g_bStopTransThread由两个按钮Start和Stop控制,点击Start的时候除了将g_bStopTransThread置FALSE,还会Resume如下线程,那么如下代码能否保证Work()执行完后才挂起线程?——Work()只有在完成任务后才会返回:
UINT  TransProc(LPVOID pParam)
{
    CGCFZDlg *pDlg = (CGCFZDlg*)pParam;
    while(TRUE)
    {
        if(g_bStopTransThread)
        {
            SuspendThread(pDlg->m_hTransThread); // 挂起当前线程
        }
        else
        {
            pDlg->Work();    // 工作代码
        }
    }
    return 0L;
}
只是想找大家帮确认下,现在有时点击了“Stop”后,似乎Work()并没有执行完,再次点击“Start”以后好像接着上次Work()没执行完的地方在跑...

解决方案 »

  1.   

    方便的话可以把Work里边的东西贴出来吗?感觉不存在你说的问题啊。Work执行完了才会while循环,然后才会SuspendThread。不过这个写法不是很好。建议Start的时候开始跑Work,然后设置互斥体,每执行完Work就释放,然后再获取。Stop按下去了就开一个新线程,WaitForSingleObject然后SuspendThread就可以了。
      

  2.   

    恩,Work()里面有一个UDP Socket会执行Send操作,点击了“停止”再“开始”以后,发现m_UDPSocket.Send()返回值小于要的发送字节数,会不会Send()以后,数据实际上并没有发送完,而此时Work()就返回,并导致线程挂起?UDP的Send()是异步发送的么?
      

  3.   

    可以使用事件对象WaitForSingleObject