1

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

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

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

      CInternetSession session(_T("Session"));

但是在调用 CInternetSession session(_T("Session")) 线程结束后

有没有办法解决它?

4

1 回答 1

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)循环,但我认为事件是在多线程应用程序中表达自己的更清晰的方式。

此外,创建您的线程的线程不应该是关闭它的线程,除非它等待它结束。在关闭线程句柄之前,您似乎没有等待新线程完成。同样,如果使用事件,那么您可以这样做:

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

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

于 2013-06-10T12:32:51.930 回答