2017-04-06 2 views
0

J'ai une DLL C++ créée dans VS2010. Cette DLL est responsable de générer un rapport et de l'envoyer à un serveur. Cette DLL est appelée par une autre application qui crée réellement les données. Comme l'envoi du fichier à un serveur prend du temps, je ne veux pas que l'application appelante attende que la DLL soit occupée à envoyer le fichier à un serveur. Pour traiter le problème mentionné ci-dessus, je veux assigner la tâche d'envoyer le fichier à un serveur (juste une petite fonction) à un thread séparé et je ne veux pas attendre que ce thread soit terminé (sinon aucun avantage). Depuis, je n'ai pas de contrôle sur l'application d'appel principale, je ne peux apporter des modifications qu'à l'intérieur de la DLL. Je suis confus comment devrais-je mettre en œuvre cette logique? Je veux dire, que se passe-t-il si le thread n'a pas terminé la tâche d'envoyer le fichier au serveur et pendant ce temps l'application appelante principale a déjà appelé cette DLL la deuxième fois.Multithreading dans VS2010

Répondre

0

Vous devez ajouter un peu plus de logique à votre DLL. Tout d'abord, l'appel à la DLL ne doit pas directement envoyer les données au serveur, mais mettre en file d'attente la tâche (il suffit d'ajouter toutes les données transmises à la file d'attente interne). La DLL peut avoir un thread de travail interne qui devrait être responsable du traitement de la file d'attente des tâches. L'aspect de l'implémentation interne et de l'architecture dépend de l'API existante (est-elle modifiable ou non)?

Astuce - jetez un oeil à DllMain() https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx - cela devrait être utile comme point d'entrée.

0

on ne sait pas tout votre contrainte, mais cela est un exemple simple d'utiliser les threads en 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(); 
} 

Dans cet exemple j'utilise une file d'attente et je limite le nombre de thread courant à 10. A la fin du programme waitalljobs attend que tout thread ait fini ses travaux.