Update to 2.0.0 tree from current Fremantle build
[opencv] / apps / HMMDemo / ThreadHowTo.txt
diff --git a/apps/HMMDemo/ThreadHowTo.txt b/apps/HMMDemo/ThreadHowTo.txt
deleted file mode 100644 (file)
index d7b84a2..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-Äàííûé íàáîð ìàêðîñîâ, îïðåäåë¸ííûõ â ôàéëå multiprocdiv.h, ñëóæèò äëÿ óïðîùåíèÿ ïðîöåññà êîíâåðòàöèè àëãîðèòìîâ îñíîâàííûõ íà îäíîì öèêëå, êîòîðûé ïîòðåáëÿåò îñíîâíóþ ÷àñòü âðåìåíè ðàáîòû àëãîðèòìà. Öåëü äàííûõ ìàêðîñîâ - ïåðåëîæèòü âûïîëíåíèå òåëà öèêëà â îòäåëüíûé ïîòîê(è), ÷òî áóäåò îñîáåííî ïîëåçíî íà ìíîãîïðîöåññîðíûõ ñèñòåìàõ. Îñíîâó ìåòîäà ðàçäåëåíèÿ ñîñòàâëÿþò 3 ôóíêöèè. Ïåðâàÿ èç íèõ, óñëîâíî íàçâàííàÿ child, âûïîëíÿåò ñàìî òåëî öèêëà. Âòîðàÿ - control (ñîêðàù¸ííî ctrl) - âñþ ÷àñòü àëãîðèòìà, êîòîðàÿ íàõîäèòñÿ ñíàðóæè öèêëà, à òàêæå çàíèìàåòñÿ ñèíõðîíèçàöèåé è çàíèìàåòñÿ ôîðìèðîâàíèåì äàííûõ äëÿ child-ôóíêöèè. Òðåòüÿ - start-ôóíêöèÿ - çàïóñêàåò è îñòàíàâëèâàåò ctrl-ôóíêöèþ. Child- è ctrl-ôóíêöèè çàïóñêàþòñÿ â îòäåëüíûõ ïîòîêàõ, à start-ôóíêöèÿ ïîñëå çàïóñêà ctrl-ôóíêöèè ñðàçó âûõîäèò, ÷òî äà¸ò âîçìîæíîñòü îêîííîìó ïðèëîæåíèþ ïðîäîëæèòü îáðàáîòêó ñîîáùåíèé.\r
-\r
-Èñïîëüçîâàíèå ýòèõ ìàêðîñîâ ëó÷øå ðàññìîòðåòü íà êîíêðåòíîì ïðèìåðå. Ïóñòü íåîáõîäèìî âû÷èñëèòü ñóììó ÷èñåë èç 6 ìàññèâîâ, â êàæäîì èç êîòîðûõ N ÷èñåë. Òîãäà èìååì ñëåäóþùèé òåêñò:\r
-\r
-***********************************************************************\r
-// MainFrame.cpp\r
-\r
-const int N = 30;\r
-\r
-int a[6][N];\r
-\r
-void CMainFrame::OnDo()\r
-{\r
-    int i, j;\r
-    int s = 0;\r
-    for( j = 0; j < 6; j ++ )\r
-    {\r
-        for( i = 0; i < N; i ++ )\r
-        {\r
-            s += a[j][i];\r
-        }\r
-    }\r
-}\r
-\r
-***********************************************************************\r
-\r
-Çäåñü åñòü îñíîâíîé öèêë ïî j, êîòîðûé ìû è áóäåì ïåðåâîäèòü íà ìíîãîïîòîêîâóþ îñíîâó.\r
-Äëÿ íà÷àëà íóæíî îïðåäåëèòü ñòðóêòóðû äëÿ ïåðåäà÷è ïàðàìåòðîâ çàäà÷è â ôóíêöèè ïîòîêîâ. Â íàøåì ñëó÷àå ïîëó÷àåì:\r
-\r
-struct ChildInputStruct {\r
-    INPUT_STRUCT_COMMON_PARAMS();\r
-    int* sum;\r
-    int* array;\r
-    int N;\r
-};\r
-\r
-struct ControlInputStruct {\r
-    int* srcArray;\r
-    int* result;\r
-    int N;\r
-};\r
-\r
-Äëÿ ïåðâîé ñòðóêòóðû ïîëå INPUT_STRUCT_COMMON_PARAMS() ÿâëÿåòñÿ îáÿçàòåëüíûì!\r
-Ïîëå sum ïåðâîé ñòðóêòóðû ïðåäíàçíà÷åíî äëÿ ñóììèðîâàíèÿ â ïàìÿòü ïî ýòîìó óêàçàòåëþ ÷èñåë èç îäíîãî ìàññèâà. Ïîëå array - óêàçàòåëü íà îäèí ìàññèâ. N - ÷èñëî ýëåìåíòîâ â îäíîì ìàññèâå. scrArray - óêàçàòåëü íà âåñü èñõîäíûé ìàññèâ. result - óêàçàòåëü íà ó÷àñòîê ïàìÿòè, êîòîðûé ïðèìåò èòîãîâîå çíà÷åíèå ñóììû. Ñëåäóåò ó÷åñòü, ÷òî result äîëæåí óêàçûâàòü íå íà äèíàìè÷åñêóþ ïåðåìåííóþ, ò.ê. îí áóäåò èñïîëüçîâàòüñÿ â ïîòîêå.\r
-\r
-Äàëåå îïðåäåëÿåì ãëîáàëüíûå ïåðåìåííûå, íåîáõîäèìûå äëÿ ôóíêöèîíèðîâàíèÿ ïîòîêîâ. Ýòî äåëàåì ñëåäóþùèì îáðàçîì:\r
-\r
-COMMON_GLOBAL_VARS( functionName, ControlInputStruct );\r
-\r
-Ïîëå functionName îçíà÷àåò èìÿ ñòàðòîâîé ôóíêöèè ( îíî òàêæå áóäåò íåîäíîêðàòíî ââîäèòüñÿ â ïîñëåäóþùèõ ìàêðîñàõ ). ControlInputStruct - èìÿ ñòðóêòóðû äëÿ ïåðåäà÷è ïàðàìåòðîâ â ctrl-ïîòîê.\r
-\r
-Äàëåå ïèøåì child-ôóíêöèþ:\r
-\r
-BEGIN_CHILD_THREAD_FUNCTION( functionName, ChildInputStruct );\r
-\r
-    int i;\r
-\r
-    BEGIN_CHILD_THREAD_CORE();\r
-\r
-        *(params->sum) = 0;\r
-\r
-        for( i = 0; i < params->N; i ++ )\r
-        {\r
-            *(params->sum) += params->array[i];\r
-        }\r
-\r
-    END_CHILD_THREAD_CORE();\r
-\r
-END_CHILD_THREAD_FUNCTION();\r
-\r
-Ïîëå functionName çäåñü è äàëåå èìååò òîò æå ñìûñë, ÷òî è â COMMON_GLOBAL_VARS. params ÿâëÿåòñÿ óêàçàòåëåì íà ñòðóêòóðó ChildInputStruct, ïîäàííóþ ïîòîêó â êà÷åñòâå ïàðàìåòðà. Îïðåäåëåíèå äîïîëíèòåëüíûõ ïåðåìåííûõ ïðîèçâîäèòñÿ ìåæäó ìàêðîñàìè BEGIN_CHILD_THREAD_FUNCTION() è BEGIN_CHILD_THREAD_CORE(). Âñå ïîëåçíûå äåéñòâèÿ ïðîèçîäÿòñÿ ìåæäó ìàêðîñàìè BEGIN_CHILD_THREAD_CORE() è END_CHILD_THREAD_CORE(). Â íàøåì ñëó÷àå òàì ñíà÷àëà îáíóëÿåòñÿ çíà÷åíèå ñóììû, à çàòåì â öèêëå ê íåé ïðèáàâëÿþòñÿ çíà÷åíèÿ èç ìàññèâà. Ìàêðîñ END_CHILD_THREAD_FUNCTION() äåëàåò âñ¸ äëÿ âûõîäà èç ôóíêöèè.\r
-\r
-Ïèøåì óïðàâëÿþùóþ ctrl-ôóíêöèþ:\r
-\r
-BEGIN_CTRL_THREAD_FUNCTION( functionName, ControlInputStruct, ChildInputStruct,\r
-                eraseFunction, beginFunction, endFunction );\r
-\r
-    int numberOfTasks = 6;\r
-    int sum[6];\r
-\r
-    BEGIN_CTRL_THREAD_CORE( numberOfTasks );\r
-\r
-        childParams.sum = sum + i;\r
-        childParams.array = params->srcArray + i * params->N;\r
-        childParams.N = params->N;\r
-\r
-    END_CTRL_THREAD_CORE();\r
-\r
-    *(params->result) = sum[0] + sum[1] + sum[2] + sum[3] + sum[4] + sum[5];\r
-\r
-END_CTRL_THREAD_FUNCTION();\r
-\r
-Çäåñü ControlInputStruct è ChildInputStruct - èìåíà âõîäíûõ ñòðóêòóð äàííûõ äëÿ ctrl- è child-ôèíêöèé ñîîòâåòñòâåííî. eraseFunction, beginFunction è endFunction - óêàçàòåëè íà ôóíêöèè, òèïà bool function( void* ). Âñåì ôóíêöèÿì íà âõîä ïîäà¸òñÿ óêàçàòåëü íà ñòðóêòóðó ControlInputStruct, ñîäåðæàùóþ íà÷àëüíûå äàííûå äëÿ óïðàâëÿþùåãî ïîòîêà. Åñëè êàêîé-òî èç ýòèõ 3-õ óêàçàòåëåé ðàâåí íóëþ, òî ñîîòâåòñòâóþùàÿ ôóíêöèÿ íå âûçûâàåòñÿ. eraseFunction - ôóíêöèÿ, âûçûâàåìàÿ â ñëó÷àå äîñðî÷íîãî çàâåðøåíèÿ ïîòîêà â ñëó÷àå åãî ïðèíóäèòåëüíîãî çàâåðøåíèÿ, beginFunction - ôóíêöèÿ, âûçûâàåìàÿ äî íà÷àëà âû÷èñëåíèé ( ìîæåò èñïîëüçîâàòüñÿ äëÿ ñìåíû ñòàòóñà ýëåìåíòîâ óïðàâëåíèÿ îêíà, íî â ýòîì ñëó÷àå óêàçàòåëü íà êëàññ îêíà åñòåññòâåííî äîëæåí âõîäèòü â ñòðóêòóðó ControlInputStruct ). endFunction - ôóíêöèÿ, âûçûâàåìàÿ ïîñëå îêîí÷àíèÿ ñ÷¸òà ( ñëó÷àé, ïðîòèâîïîëîæíûé ôóíêöèè beginFunction ). Â íàøåì ñëó÷àå ýòè ôóíêöèè ìîæíî íå ïèñàòü è ïîñòàâèòü â êà÷åñòâå ïàðàìåòðîâ íóëè.\r
-numberOfTasks - îáùåå ÷èñëî çàäà÷ ( â ìàêðîñå BEGIN_CTRL_THREAD_CORE() ìîæåò ñòîÿòü ïðîñòî ÷èñëî 6 â íàøåì ñëó÷àå ).\r
-Ìåæäó ìàêðîñàìè BEGIN_CTRL_THREAD_FUNCTION() è BEGIN_CTRL_THREAD_CORE() ñëåäóåò ïîìåùàòü îïðåäåëåíèå ëîêàëüíûõ ïåðåìåííûõ è âû÷èñëåíèå, åñëè òàêîå íåîáõîäèìî, îáùåãî êîëè÷åñòâà øàãîâ â ðàçâîðà÷èâàåìîì öèêëå, à òàêæå âñå ïðåäâàðèòåëüíûå âû÷èñëåíèÿ. Ìåæäó ìàêðîñàìè BEGIN_CTRL_THREAD_CORE() è END_CTRL_THREAD_CORE() ñëåäóåò çàïîëíèòü ñòðóêòóðó childParams - ñòðóêòóðó òèïà ChildInputStruct íîâûì çàäàíèåì. Â íàøåì ñëó÷àå çàïîëíÿþòñÿ ïîëÿ sum, array è N ñîîòâåòñòâóþùèìè çíà÷åíèÿìè. Âíóòðè ýòèõ ìàêðîñîâ ïåðåìåííàÿ i îòâå÷àåò çà òåêóùèé íîìåð çàäàíèÿ.\r
-Ìåæäó ìàêðîñàìè END_CTRL_THREAD_CORE() è END_CTRL_THREAD_FUNCTION() ïîìåùàåòñÿ êîä, êîòîðûé äîëæåí âûïîëíÿòüñÿ ïîñëå çàâåðøåíèÿ âñåõ child-ïðîöåññîâ, íî ïåðåä âûõîäîì èç ctrl-ïðîöåññà. Â íàøåì ïðèìåðå â ýòîì ìåñòå ñòîèò âû÷èñëåíèå ñóììû ýëåìåíòîâ èç ìàññèâà sum è çàíåñåíèå ðåçóëüòàòà ïî àäðåñó result.\r
-Òàêèì îáðàçîì, ctrl-ôóíêöèþ â íàøåì ñëó÷àå íóæíî çàïèñàòü ñëåäóþùèì îáðàçîì:\r
-\r
-BEGIN_CTRL_THREAD_FUNCTION( functionName, ControlInputStruct, ChildInputStruct, 0, 0, 0 );\r
-\r
-    int sum[6];\r
-\r
-    BEGIN_CTRL_THREAD_CORE( 6 );\r
-\r
-        childParams.sum = sum + i;\r
-        childParams.array = params->srcArray + i * params->N;\r
-        childParams.N = params->N;\r
-\r
-    END_CTRL_THREAD_CORE();\r
-\r
-    *(params->result) = sum[0] + sum[1] + sum[2] + sum[3] + sum[4] + sum[5];\r
-\r
-END_CTRL_THREAD_FUNCTION();\r
-\r
-Äàëåå ïèøåì ñòàðòîâóþ ôóíêöèþ:\r
-\r
-BEGIN_START_THREAD_FUNCTION( functionName,( int* srcArray, int* result, int N ),\r
-        ControlInputStruct);\r
-\r
-    params->srcArray = srcArray;\r
-    params->result = result;\r
-    params->N = N;\r
-\r
-END_START_THREAD_FUNCTION();\r
-\r
-Çäåñü â ìàêðîñå BEGIN_START_THREAD_FUNCTION() âòîðûì ïàðàìåòðîì çàïèñàíû âõîäíûå äàííûå ñòàðòîâîé ôóíêöèè, à òðåòüèì ïàðàìåòðîâ - èìÿ âõîäíîé ñòðóêòóðû äëÿ ctrl-ôóíêöèè.\r
-Ìåæäó ìàêðîñàìè BEGIN_START_THREAD_FUNCTION() è END_START_THREAD_FUNCTION() íåîáõîäèìî çàïîëíèòü âõîäíóþ ñòðóêòóðó òèïà ControlInputStruct, çàäàííûé óêàçàòåëåì params.\r
-\r
-Äëÿ âîçìîæíîñòè çàïóñêà ñòàðòîâîé ôóíêöèè èç äðóãèõ ôàéëîâ â çàãîëîâî÷íîì ôàéëå íåîáõîäèìî íàïèñàòü:\r
-\r
-DEFINE_START_THREAD_FUNCTION( functionName, ( int* srcArray, int* result, int N ) );\r
-\r
-\r
-\r
-\r
-Èòàê, ïîëíàÿ ïåðåðàáîòàííàÿ ïðîãðàììà â íàøåì ïðèìåðå áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:\r
-\r
-***********************************************************************\r
-// MainFrame.cpp\r
-\r
-#include "MultiThr.h"\r
-\r
-const int N = 30;\r
-\r
-int a[6][N];\r
-int result;\r
-\r
-void CMainFrame::OnDo()\r
-{\r
-    functionName( (int*)a, &result, N );\r
-}\r
-***********************************************************************\r
-// MultiThr.h\r
-\r
-#include "multiprocdiv.h"\r
-\r
-DEFINE_START_THREAD_FUNCTION( functionName, ( int* srcArray, int* result, int N ) );\r
-\r
-***********************************************************************\r
-// MultiThr.cpp\r
-\r
-#include "MultiThr.h"\r
-\r
-// defining structures\r
-struct ChildInputStruct {\r
-    INPUT_STRUCT_COMMON_PARAMS();\r
-    int* sum;\r
-    int* array;\r
-    int N;\r
-};\r
-\r
-struct ControlInputStruct {\r
-    int* srcArray;\r
-    int* result;\r
-    int N;\r
-};\r
-\r
-// setting global variables\r
-COMMON_GLOBAL_VARS( functionName, ControlInputStruct );\r
-\r
-// child-function\r
-BEGIN_CHILD_THREAD_FUNCTION( functionName, ChildInputStruct );\r
-\r
-    int i;\r
-\r
-    BEGIN_CHILD_THREAD_CORE();\r
-\r
-        *(params->sum) = 0;\r
-\r
-        for( i = 0; i < params->N; i ++ )\r
-        {\r
-            *(params->sum) += params->array[i];\r
-        }\r
-\r
-    END_CHILD_THREAD_CORE();\r
-\r
-END_CHILD_THREAD_FUNCTION();\r
-\r
-// control-function\r
-BEGIN_CTRL_THREAD_FUNCTION( functionName, ControlInputStruct, ChildInputStruct, 0, 0, 0 );\r
-\r
-    int sum[6];\r
-\r
-    BEGIN_CTRL_THREAD_CORE( 6 );\r
-\r
-        childParams.sum = sum + i;\r
-        childParams.array = params->srcArray + i * params->N;\r
-        childParams.N = params->N;\r
-\r
-    END_CTRL_THREAD_CORE();\r
-\r
-    *(params->result) = sum[0] + sum[1] + sum[2] + sum[3] + sum[4] + sum[5];\r
-\r
-END_CTRL_THREAD_FUNCTION();\r
-\r
-// start-function\r
-BEGIN_START_THREAD_FUNCTION( functionName,( int* srcArray, int* result, int N ),\r
-        ControlInputStruct);\r
-\r
-    params->srcArray = srcArray;\r
-    params->result = result;\r
-    params->N = N;\r
-\r
-END_START_THREAD_FUNCTION();\r
-\r
-***********************************************************************\r
-\r
-Ïðèìå÷àíèå 1: ïîâòîðíûé çàïóñê start-ôóíêöèè â ñëó÷àå, åñëè ctrl-ïîòîê åù¸ íå çàâåðø¸í ïðèâåä¸ò ê åãî ïðèíóäèòåëüíîìó çàâåðøåíèþ!\r
-Ïðèìå÷àíèå 2: äëÿ Windows NT 4.0 â íàñòðîéêàõ ïðîåêòà ñëåäóåò çàäàòü _WIN32_WINNT=4.\r
-\r
-\r
-\r
-\r
-Òàêæå åñòü íåêîòîðûå âñïîìîãàòåëüíûå ñðåäñòâà äëÿ áîëåå äåòàëüíîãî óïðàâëåíèÿ:\r
-1) Äëÿ îïðåäåëåíèÿ ñîñòîÿíèÿ ctrl ïîòîêà ñëóæèò ìàêðîñ IS_THREAD_STILL_WORKING( functionName ), êîòîðûé âîçâðàùàåò true, åñëè ctrl-ïîòîê âñ¸ åù¸ ðàáîòàåò è false - â ïðîòèâíîì ñëó÷àå. Åñëè start-ôóíêöèÿ åù¸ íè ðàçó íå çàïóñêàëàñü, òî ìàêðîñ âåðí¸ò íåêîððåêòíîå çíà÷åíèå.\r
-2) Äëÿ èñïîëüçîâàíèÿ êðèòè÷åñêèõ ñåêöèé âíóòðè child- è ctrl-ôóíêöèé ìîæíî èñïîëüçîâàòü ìàêðîñû ENTER_THREAD_CRITICAL_SECTION() è LEAVE_THREAD_CRITICAL_SECTION(), òîëüêî îáðàçóþùèå ôóíêöèè ìàêðîñû íå ìîãóò ñòîÿòü ìåæäó ENTER_THREAD_CRITICAL_SECTION() è LEAVE_THREAD_CRITICAL_SECTION().\r
-3) Äëÿ òðàññèðîâêè ïîòîêîâ âìåñòî ìàêðîñîâ âèäà _RPT0, _RPT1 è ò.ä. ìîæíî èñïîëüçîâàòü ìàêðîñû thrWriteToTrace0, thrWriteToTrace1 è ò.ä., êîòîðûå àâòîìàòè÷åñêè íå áóäóò ñêîìïèëèðîâàíû äëÿ Release-âåðñèè.\r