2017-04-06 14 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を2回目に呼び出していた場合はどうなりますか。

答えて

0

DLLにさらにロジックを追加する必要があります。まず、DLLへの呼び出しは、直接データをサーバーに送信するのではなく、タスクをキューに入れます(渡されたすべてのデータを内部キューに追加するだけです)。 DLLは、タスクの待ち行列の処理を担うべき内部ワーカースレッドを有することができる。

内部実装とアーキテクチャの外観は、既存のAPIに依存します(変更可能かどうか)。

ヒント - DllMain()https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspxを参照してください - エントリポイントとして役立つはずです。

0

それはすべてあなたの制約は明らかではないが、これは、C++でスレッドを使用するための簡単な例である:私はキューを使用し、私が10 に現在のスレッドの数を制限するこのサンプルで

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(); 
} 

waitalljobsプログラムの終了は、すべてのスレッドが作業を終了したことを待ちます。

関連する問題