2017-04-06 99 views
0

我有一個在VS2010中創建的C++ DLL。該DLL負責生成報告並將其發送到服務器。該DLL由實際創建數據的另一個應用程序調用。由於發送文件到服務器需要一些時間,所以我不希望調用應用程序等到DLL忙於將文件發送到服務器。VS2010中的多線程

爲了解決上述問題,我想將文件發送到一個服務器(只有一個小函數)到一個單獨的線程的任務,並且不想等待這個線程完成(否則沒有好處)。

while(UserShutDownTheApp) 
{ 
    - Main App Gather Data 
    - Main App Call data management DLL and pass data to it 
     - DataManagementDLL: Generate a Report 
     - DataManagementDLL: Start a THREAD and Send report to Server by this THREAD. Do not wait for this THREAD to complete 
    - Main App finishes this iteration and is going to enter into next iteration.  
} 

因爲我沒有主調用應用程序的控制權,所以我只能在DLL內進行修改。我很困惑我應該如何實現這個邏輯?我的意思是,如果線程沒有完成將文件發送到服務器的任務,並且主調用應用程序第二次已經調用該DLL,會發生什麼情況。

回答

0

您應該爲您的DLL添加更多的邏輯。首先,對DLL的調用不應直接將數據發送到服務器,而是將任務排隊(只需將所有傳遞的數據添加到內部隊列中)。該DLL可以有內部工作線程負責處理任務隊列。

內部實現和體系結構的外觀應該如何,取決於現有的API(可以修改或不修改)。

提示 - 請看看DllMain()https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx - 它應該是有用的入口點。

0

目前尚不清楚你所有的約束,但是這是一個簡單的例子,要在C線程++:

void sendreport(std::string data) 
{ 
    std::cout << "send " << data; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 

} 

std::queue<std::thread> jobs; 

void addjob(std::string data) 
{ 
    while (jobs.size() > 10) 
    { 
     jobs.front().join(); 
     jobs.pop(); 
    } 

    jobs.emplace(sendreport, data); 
} 

void waitalljobs() 
{ 
    while (jobs.size() > 0) 
    { 
     jobs.front().join(); 
     jobs.pop(); 
    } 
} 


int main() 
{ 

    addjob("first"); 
    addjob("second"); 
    waitalljobs(); 
} 

在此示例中,我使用一個隊列,我限制了當前線程的數量以10 在waitalljobs程序的終止等待所有線程完成其作品。