windows下利用線程池完成多任務的分配和運行
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
在做項目的過程中有時候為了提升效率,用了多線程的方法來對任務進行分割和應用,后來發現,采用線程池的方法能更好的利用線程資源來計算任務,網上有很多關于如何運行線程池的例子,msdn上也給出了對應的例子:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686980(v=vs.85).aspx
感興趣的話大家可以去看看,這里我給出一個簡單的demo,利用線程池單次調用多次調用,例子如下:
[cpp] view plain copy
- #include<Windows.h>
- #include<iostream>
- #include<cstdlib>
- using namespace std;
- #define THREAD_NUM 10
- struct tempStruct
- {
- int a;
- int b;
- };
- VOID CALLBACK SimpleCallback(PTP_CALLBACK_INSTANCE Instance,void* Context);
- VOID CALLBACK WorkCallbackTemp(PTP_CALLBACK_INSTANCE Instance, void* Context, PTP_WORK Work);
- void main()
- {
- PTP_WORK tpWork[THREAD_NUM];
- tempStruct transferStruct[THREAD_NUM];
- for ( int i = 0; i< THREAD_NUM; i++ )
- {
- transferStruct[i].a = i;
- transferStruct[i].b = i+1;
- }
- //單次工作提交
- TrySubmitThreadpoolCallback(SimpleCallback,&transferStruct[2],NULL);
- for ( int i = 0; i< THREAD_NUM; i++ )
- tpWork[i] = CreateThreadpoolWork(WorkCallbackTemp,&transferStruct[i],NULL);
- //提交工作
- for ( int i = 0; i< THREAD_NUM; i++ )
- SubmitThreadpoolWork(tpWork[i]);
- //等待工作結束
- for ( int i = 0; i< THREAD_NUM; i++ )
- WaitForThreadpoolWorkCallbacks(tpWork[i],false);
- //關閉工作對象
- for ( int i = 0; i< THREAD_NUM; i++ )
- CloseThreadpoolWork(tpWork[i]);
- system("pause");
- }
- VOID CALLBACK SimpleCallback(PTP_CALLBACK_INSTANCE Instance,void* Context)
- {
- tempStruct *pt = (tempStruct *)Context;
- int pruduct = pt->a * pt->b;
- cout <<"Simple struct a: "<<pt->a<<" struct_temp.b: "<<pt->b<<" pruduct: "<<pruduct<<endl;
- }
- VOID CALLBACK WorkCallbackTemp(PTP_CALLBACK_INSTANCE Instance, void* Context, PTP_WORK Work)
- {
- tempStruct *pt = (tempStruct *)Context;
- int sum = pt->a + pt->b;
- cout <<"Work struct a: "<<pt->a<<" struct_temp.b: "<<pt->b<<" sum: "<<sum<<endl;
- }
PS有個網站的教程寫得很好,收益很多大家也可以去看看:http://www.cnblogs.com/kzloser/archive/2013/03/11/2909221.html
做個mark,希望對需要的朋友有幫助!
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成