2011-07-27 6 views
0

저는 C++ 스레딩 관련 도움이 필요합니다. 다운로드 파일 (인터넷에서 파일을 다운로드하기 위해)로 내 보낸 함수가있는 DLL을 만들었습니다. 이 함수는 차례로 파일을 다운로드하기위한 스레드를 만듭니다 (파일을 다운로드하는 데 사용되는 함수가 URLDownloadToFile 즉, 다운로드 기능을 스레드에 넣는 기능을 차단합니다).다운로드 할 C++ 스레딩

다음을 달성하고 싶습니다.

  1. downloadfile 함수를 호출하면 주 스레드가 차단되어서는 안됩니다.

  2. 한 번에 두 개 이상의 파일을 다운로드하고 싶습니다.

다운로드 기능이 C++로 작성된 dll에 있으며이 dll이 파스칼에서 사용된다는 점에 유의하십시오. 당신의 downloadFile 함수는 URLDownloadToFile 함수가처럼 차단을 일으킬 것이다, 반환하기 전에 완료 다운로드 스레드를 기다리는 것처럼

struct DOWNLOADPARAM 
{ 
    HANDLE hEventStop; 
    TCHAR *szURL; 
    TCHAR *szFilePath; 
}; 


DWORD WINAPI Transfer(void *hw) 
{ 
    Mutex mutex_; 

    DOWNLOADPARAM *const pDownloadParam = static_cast<DOWNLOADPARAM *>(hw); 
    CBSCallbackImpl bsc(NULL, pDownloadParam->hEventStop); 


      const HRESULT hr = ::URLDownloadToFile(NULL,pDownloadParam->szURL ,pDownloadParam->szFilePath,0,&bsc); 


    return 0; 
} 


extern "C" void __declspec(dllexport) downloadfile(TCHAR *url, TCHAR *dest) 
{ 
    Mutex mutex_; 

    DWORD dwThreadId; 
    DOWNLOADPARAM *obj = new DOWNLOADPARAM(); 
    obj->szURL  = url; 
    obj->szFilePath = dest; 


    if((hThread = CreateThread(NULL, 0, Transfer, (LPVOID)obj, 0,&dwThreadId)) != NULL) 
    { 
    } 


// Following code block the thread untill finished 

    WaitForSingleObject(hThread, INFINITE); 
     TerminateThread(hThread, 0); 
    CloseHandle(hThread); 
} 
+3

당신은이 문제를 설명해야합니다. – sth

+1

또한 이러한 뮤텍스로 무엇을하고 있는지 설명해야합니다. 나는 네가 그들을 선언 한 것을 본다. 그러나 네가 그들을 사용하는 것을 보지 못한다. –

+0

내가 언급 한 것처럼 실제로 inno 스크립트 (파스칼 스크립팅)에서 dll downloadfile 함수를 호출하려고합니다. inno는 쓰레드 나 타이머를 지원하지 않거나 대기중인 함수를 지원하지 않기 때문에 비동기 인터넷에서 파일을 다운로드 할 새로운 dll 파일을 생성하는 이유가 있습니다. 더 많은 정보/도움이 필요합니다. – Iqbal

답변

1

것 같습니다 : 다음

코드 조각입니다. 나는 이것을 두 가지 조작으로 구분할 것을 제안합니다. downloadFile은 호출 프로그램이 작업이 완료되었는지 여부를 확인하는 데 사용할 수있는 일종의 핸들 또는 이벤트를 반환해야합니다. 그런 다음 스레드와 핸들을 정리하는 두 번째 함수를 제공합니다. 그런 식으로 호출 프로그램은 WaitForMultipleObjects 또는 다른 메커니즘을 사용하여 계속 실행하고 다운로드가 완료 될 때 알림을 받으면서 자체 처리를 수행 할 수 있습니다. 내 Win32는 기껏해야 스케치이므로 예제 코드를 작성할 수는 없지만 디자인 아이디어가 도움이되기를 바랍니다.

+0

덕분에 아이디어가 정말 도움이되지만, 제가 언급 한 것처럼 실제로 dll downloadfile 함수를 호출하고 싶습니다. inno script (파스칼 스크립팅). inno는 쓰레드 나 타이머를 지원하지 않거나 대기중인 함수를 지원하지 않기 때문에 비동기 인터넷에서 파일을 다운로드 할 새로운 dll 파일을 생성하는 이유가 있습니다. 이 문제에 대한 자세한 정보가 필요합니다 ... – Iqbal

+0

이 경우 DLL에서 변수를 사용하여 작업이 완료된 시점을 추적하고 폴링이 참일 때를 조사 할 수 있습니다. 약간 미숙한데 액세스를 동기화해야 할 수도 있습니다. 한 번에 두 번 다운로드하거나 한 번에 두 번 실행하면 동일한 변수가 공유되지 않도록주의해야합니다. . – qid

+0

코드가 완벽하게 작동합니다.이 dll 코드 문제는 다음과 같습니다. 대기 함수 (waitforsingleobject)를 dll에서 호출하여 비동기로 호출하면 다운로드가 스레드 종료로 작동하지 않습니다. 이 DLL은 Inno 스크립트에서 제공됩니다. 어떻게 호출을 차단하지 않고 대기를 구현합니다. 또는 인터넷 파일을 비동기로 다운로드 할 수있는 다른 방법이 있습니다. – Iqbal

0

스레드를 시작한 직후에 스레드 핸들에서 WaitForSingleObject을 호출하는 것은 동기식/블로킹 호출 일뿐입니다. WaitForSingleObject을 연기해야합니다.

+0

이것을 달성하는 방법은 나를 위해 작동하는 코드를 구성 할 수 있습니다. – Iqbal

+0

사실 타이머는 dll의 downloadfile 함수를 호출하는 Inno 스크립트에 구현되어야합니다. 하지만 불행히도 inno 스크립트는 theads 및 타이머를 지원하지 않습니다. 그래서 내가 이것을 달성하기 위해 C++ dll을 코딩 한 이유입니다. 그러나 인터넷에서 다운로드 파일은 동기화 호출이며 목적을 해결하지 못합니다. 호출은 비동기이어야합니다. 그래서 나는 dll의 배경 스레드에서 파일을 다운로드 할 수 있고 inno 스크립트 설치 프로그램 UI에서도 작업 할 수있다. – Iqbal