diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index b345b63..7610b3c 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index 365f077..467e55d 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -107,7 +107,7 @@ Level3 Disabled WIN32;_WINDOWS;I_AM_EGK;_DEBUG;%(PreprocessorDefinitions) - true + false CompileAsCpp false true @@ -142,7 +142,7 @@ copy $(TargetPath) \EgtProg\DllD32 Level3 Disabled WIN32;_WINDOWS;I_AM_EGK;_DEBUG;%(PreprocessorDefinitions) - true + false CompileAsCpp false true @@ -177,7 +177,7 @@ copy $(TargetPath) \EgtProg\DllD64 true true WIN32;_WINDOWS;I_AM_EGK;NDEBUG;%(PreprocessorDefinitions) - true + false CompileAsCpp Speed AnySuitable @@ -224,7 +224,7 @@ copy $(TargetPath) \EgtProg\Dll32 true true WIN32;_WINDOWS;I_AM_EGK;NDEBUG;%(PreprocessorDefinitions) - true + false CompileAsCpp Speed AnySuitable diff --git a/VolZmap.h b/VolZmap.h index 8ff8690..3686bc3 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -19,6 +19,7 @@ #include "/EgtDev/Include/EGkVolZmap.h" #include #include +#include // ------------------------- STRUTTURE ----------------------------------------------------------- struct AppliedVector { @@ -402,6 +403,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW mutable std::vector m_SliceXY ; mutable std::vector m_SliceXZ ; mutable std::vector m_SliceYZ ; + mutable std::mutex SliceMutex ; Tool m_Tool ; } ; diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 0f49276..26a7b21 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -24,6 +24,8 @@ #include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Extern/Eigen/Core" #include "/EgtDev/Extern/Eigen/SVD" +#include +#include using namespace std ; @@ -916,11 +918,25 @@ VolZmap::UpdateTripleMapGraphics( void) const } // Calcolo i triangoli sui blocchi - for ( int t = 0 ; t < m_nNumBlock ; ++ t) { + int nBlockUpdated = 0 ; + vector< future> vRes ; + vRes.resize( m_nNumBlock) ; + for ( int i = 0 ; i < m_nNumBlock ; ++ i) { // Se il blocco deve essere processato - if ( m_BlockToUpdate[t]) { + if ( m_BlockToUpdate[i]) { // processo ... - ExtMarchingCubes( int( t), vVoxContainerVec[t]) ; + ++ nBlockUpdated ; + vRes[i] = async( launch::async, &VolZmap::ExtMarchingCubes, this, i, ref( vVoxContainerVec[i])) ; + } + } + bool bOk = true ; + int nTerminated = 0 ; + while ( nTerminated < nBlockUpdated) { + for ( int i = 0 ; i < m_nNumBlock ; ++ i) { + if ( m_BlockToUpdate[i] && vRes[i].valid() && vRes[i].wait_for( chrono::microseconds{ 1 }) == future_status::ready) { + bOk = vRes[i].get() && bOk ; + ++ nTerminated ; + } } } @@ -1205,11 +1221,13 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bDefTopology = true ; } if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + SliceMutex.lock() ; auto it = m_SliceYZ[nSlBlockN].find( nSliceN) ; if ( it != m_SliceYZ[nSlBlockN].end()) { bMatOnSlice = it->second ; bDefTopology = true ; } + SliceMutex.unlock() ; } } else if ( abs( nAdjVox3[nCount]) == 2) { @@ -1219,11 +1237,13 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bDefTopology = true ; } if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + SliceMutex.lock() ; auto it = m_SliceXZ[nSlBlockN].find( nSliceN) ; if ( it != m_SliceXZ[nSlBlockN].end()) { bMatOnSlice = it->second ; bDefTopology = true ; } + SliceMutex.unlock() ; } } else if ( abs( nAdjVox3[nCount]) == 3) { @@ -1233,11 +1253,13 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bDefTopology = true ; } if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + SliceMutex.lock() ; auto it = m_SliceXY[nSlBlockN].find( nSliceN) ; if ( it != m_SliceXY[nSlBlockN].end()) { bMatOnSlice = it->second ; bDefTopology = true ; } + SliceMutex.unlock() ; } } } @@ -1301,20 +1323,29 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const if ( abs(nAdjVox3[nCount]) == 1) { if ( nSlBlockN == nBlock) SliceYZ.emplace( nSliceN, bMatOnSlice) ; - else + else { + SliceMutex.lock() ; m_SliceYZ[nSlBlockN].emplace( nSliceN, bMatOnSlice) ; + SliceMutex.unlock() ; + } } else if ( abs(nAdjVox3[nCount]) == 2) { if ( nSlBlockN == nBlock) SliceXZ.emplace( nSliceN, bMatOnSlice) ; - else + else { + SliceMutex.lock() ; m_SliceXZ[nSlBlockN].emplace( nSliceN, bMatOnSlice) ; + SliceMutex.unlock() ; + } } else if ( abs(nAdjVox3[nCount]) == 3) { if ( nSlBlockN == nBlock) SliceXY.emplace(nSliceN, bMatOnSlice) ; - else + else { + SliceMutex.lock(); m_SliceXY[nSlBlockN].emplace( nSliceN, bMatOnSlice) ; + SliceMutex.unlock() ; + } } }