繁体   English   中英

VS2010中的多线程

[英]Multithreading in VS2010

我在VS2010中创建了一个C ++ DLL。 该DLL负责生成报告并将其发送到服务器。 实际创建数据的另一个应用程序调用此DLL。 由于将文件发送到服务器需要一些时间,因此,我不希望调用应用程序等待DLL忙于将文件发送到服务器。

为了解决上述问题,我想将发送文件到服务器的任务(只是一个小功能)分配给单独的线程,并且不想等待此线程完成(否则没有好处)。

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,会发生什么情况。

您应该向DLL添加更多逻辑。 首先,对DLL的调用不应直接将数据发送到服务器,而应将任务排队(只需将所有传递的数据添加到内部队列中)。 DLL可以具有内部工作线程,该工作线程应负责处理任务队列。

内部实现和架构的外观取决于现有的API(是否可修改)。

提示-请查看DllMain() https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682583 ( v= vs.85).aspx-作为入口点应该有所帮助。

尚不清楚所有约束,但这是在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等待所有线程完成其工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM