CWinApp theApp;using namespace std;
//UNIT Createvirus(LPVOID pParam);int m_mutex=0;
HANDLE hMutex;
UINT Createvirus(LPVOID pParam);int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
    hMutex=CreateMutex(NULL,FALSE,NULL);
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("致命错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
AfxBeginThread(Createvirus,NULL);
WaitForSingleObject(hMutex,INFINITE);
m_mutex=1;
ReleaseMutex(hMutex);
Sleep(4000);
} return nRetCode;
}
UINT Createvirus(LPVOID pParam)
{
  WaitForSingleObject(hMutex,INFINITE);
  m_mutex=0;
  //AfxMessageBox("你好");
 cout<<"I love you";
  ReleaseMutex(hMutex);
  return 0;
}
我不明白,应该是Createvirus先执行呀,可是如果主程序不写Sleep(4000);
则不会执行Createvirus中的cout<<"I love you";写上了才执行。1.为什么?
2.怎么做才能保证Createvirus一直单独执行,完毕后,才开始执行主程序,然后程序结束。

解决方案 »

  1.   

    使用_beginthreadex创建线程,它返回一个HANDLE,然后用WaitForSingleObject等待线程的结束
      

  2.   

    还有,线程函数的声明方式应该是这样的:
    UINT __stdcall Createvirus(LPVOID pParam);
      

  3.   

    上面的代码不是锁住了吗?主程序中WaitForSingleObject,子线程同样也WaitForSingleObject,两个线程同进都在等待?
      

  4.   

    五哥满世界溜达,谢谢__stdcall是回调吧,这个我还不太清楚为什么用它。线程返回句柄可以拿来当WaitForSingleObject的参数用吗?那CreateMutex可以不用吗?那它作用是什么呢?
      

  5.   

    我不明白,应该是Createvirus先执行
    ************************************************************************************
    AfxBeginThread(Createvirus,NULL);只是创建了这个线程,并不能保证马上把cpu分配给它使用,也许执行完这句后还是主线程占用cpu
    ************************************************************************************
    可是如果主程序不写Sleep(4000);则不会执行Createvirus中的cout<<"I love you";
    ************************************************************************************
    主线程不执行Sleep则立即执行return nRetCode;了,进程都结束了,依附于进程的线程肯定也结束了,那肯定不可能再执行打印语句了。
                                                                          ************************************************************************************
    怎么做才能保证Createvirus一直单独执行,完毕后,才开始执行主程序,然后程序结束。
    ************************************************************************************
    一楼是正解
      

  6.   

    使用_beginthreadex创建线程,它返回一个HANDLE,然后用WaitForSingleObject等待线程的结束
    **********************************用了这个句柄就不用CreateMutex是吗??
      

  7.   

    想要个以线程返回HANDLE做WaitForSingleObject参数的代码,谢谢我只会自己创建Mutex
      

  8.   

    主程序
    AfxBeginThread(Createvirus,NULL);
    WaitForSingleObject(hMutex,INFINITE);
    改为
    HANDLE h = AfxBeginThread(Createvirus,NULL);
    WaitForSingleObject(h,INFINITE);-------------------------------------------------------
    广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711