CInternetSession关闭线程句柄

时间:2013-06-10 11:45:12

标签: c++ multithreading wininet beginthreadex

我尝试创建简单的应用程序,在FTP服务器上写入/读取文件。 我创建了一个线程

    HANDLE hThread;
    unsigned threadID;
    hThread = (HANDLE)_beginthreadex( NULL, 0, &foo, NULL, 0,NULL );    
    CloseHandle( hThread );

函数foo()会像这样创建新的互联网会话

      CInternetSession session(_T("Session"));

但是在调用CInternetSession会话(_T(“Session”)之后)线程结束

有没有办法解决它?

1 个答案:

答案 0 :(得分:0)

您需要线程函数等待事件或进入循环以防止函数结束。当该函数退出时,线程将会死亡。

例如,您可以使用Windows事件API:

void foo(){
  // The Event exitSessionEvent must be declared somewhere where the controlling 
  // thread can access it. This might be a global event for example (in a namespace).
  // You must initialise it using CreateEvent.

  CInternetSession session(_T("Session"));
  // ... do some stuff ....
  WaitForSingleObject(exitSessionEvent, INFINITE);
  session.Close(); //Done so cleanup
}

现在,在设置事件“exitSessionEvent”之前,线程函数不会退出(由其他人设置)。

您也可以使用某种类型的标志并使用while(flag)循环,但事件是我认为在多线程应用程序中表达自己的更清晰的方法。

创建你的线程的线程也不应该是关闭它的线程,除非它为它结束WAITS。在关闭线程句柄之前,看起来好像您正在等待新线程完成。 如果使用事件,那么你可以这样做:

HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex( NULL, 0, &foo, NULL, 0,NULL );  
WaitForSingleObject(hThread, INFINITE);  
CloseHandle( hThread );

这将在关闭句柄之前等待线程完成。