多线程
加载图像过慢时,可考虑使用多线程加载,速度提升的不是一般的快。
直接上代码:
int iThreadIndex = 0;
bool bHasThread = false;
int iThreadNum = 6;//根据自己需要修改
vector<CWinThread*> thread_Enc;
vector handle_Enc;
for(int i = 0; i < iThreadNum; i++ )
{
thread_Enc.push_back(NULL);
handle_Enc.push_back(NULL);
}
while( iThreadIndex < vec_files2.size() )
{
ImageData p;
p.image_num = iThreadIndex;
p.image_path = vec_files2;
for ( int i = 0; i < iThreadNum; i++ )
{
if ( thread_Enc[i] != NULL )
{
DWORD dwExitCode = 0;
GetExitCodeThread(handle_Enc[i], &dwExitCode);
if (dwExitCode != STILL_ACTIVE)
{
thread_Enc[i] = AfxBeginThread(ImageThread, &p );
handle_Enc[i] = thread_Enc[i]->m_hThread;
bHasThread = true;
break;
}
else
bHasThread = false;
}
else
{
thread_Enc[i] = AfxBeginThread(ImageThread, &p );
handle_Enc[i] = thread_Enc[i]->m_hThread;
bHasThread = true;
break;
}
}
if( bHasThread )
{
bHasThread = false;
iThreadIndex++;
pInfoBar->SetProgressPosition( iThreadIndex );
}
Sleep(10);
}
for ( int i = 0; i < iThreadNum/m_Thread_Num/; i++ )
{
if ( thread_Enc[i] != NULL )
{
DWORD dwExitCode = 0;
GetExitCodeThread(handle_Enc[i], &dwExitCode);
if (dwExitCode == STILL_ACTIVE)
{
WaitForSingleObject(handle_Enc[i], INFINITE);
continue;
}
}
}
其中
struct ImageData
{
int image_num;
vector image_path;
};
UINT ImageThread(LPVOID lpParameter)
{
ImageData* p = (ImageData*)lpParameter;
addDcmfile(p->image_path[p->image_num].c_str());
return 0;
}