Ho un numero di thread di lavoro che eseguono tutti un'attività di riempimento in pieno su diverse regioni di una bitmap. Fanno tutte le chiamate a una sub-routine ricorsiva con diversi parametri (coordinate). Fyi, sto usando un metodo di scansione. Ho implementato una funzionalità di ripristino che mira a eliminare questi processi in modo che possano ricominciare.
Il modo in cui attualmente ho implementato il mio meccanismo di uccisione, consiste nell'usare un evento kill con reset manuale e rendere la subroutine flood-fill restituita se viene segnalata. In questo modo, i fili continueranno a visitare un numero considerevole di punti sulla regione a cui sono limitati, prima di abbandonare beato, ma comunque saltare l'operazione di riempimento pertinente. Mi stavo chiedendo se c'è un modo più efficiente per farlo.
P.S. Sì, lo so che è un over-kill per flood-fill, ma questa è una domanda generale. Si potrebbe immaginare una matrice in cui si desidera eseguire alcune costose operazioni locali basate su alcune condizioni locali e utilizzare una routine ricorsiva della stessa natura di un approccio scanline.
EDIT: Ecco il design attuale del mio framework:
m_pThread[i] = AfxBeginThread(FloodFill_Sub_ThreadProc, (LPVOID)m_pFloodFillInput[i], 0, 0, CREATE_SUSPENDED);
con threadprocedures definito come:
UINT CTestShellDlg::FloodFill_Sub_ThreadProc(LPVOID pData)
{
...
FloodFill_Sub(mid, mid, Color_old, Color_new);
}
e infine FloodFill_Sub:
void CTestShellDlg::FloodFill_Sub(CPoint& node, CPoint& mid, COLORREF Color_old, COLORREF Color_new) /*Sub-routine to be used by threads*/
{
if (KillEventTriggered())
return;
if (RecursionTerminationCondition)
return;
//loop some scans and make recursive calls to FloodFill_Sub
...
}
Ora nella sezione del ciclo, si potrebbero aggiungere ulteriori controlli KillEventTriggered (), ma mi chiedo se potrebbe esserci un approccio migliore.