2017-04-06 100 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程序的终止等待所有线程完成其作品。