Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /Plugin/DefaultPlugin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (hide annotations) (download) (as text)
Wed Feb 10 18:21:00 2010 UTC (14 years, 2 months ago) by sho1get
File MIME type: text/x-c++src
File size: 9348 byte(s)


1 sho1get 11 #include "StdAfx.h"
2     #include "DefaultPlugin.h"
3    
4     //////////////////////////////////////////////////////////////////////////
5    
6     CDefaultPlugin::CDefaultPlugin()
7     {
8     doConstructor();
9     }
10    
11     CDefaultPlugin::~CDefaultPlugin()
12     {
13     }
14    
15     //////////////////////////////////////////////////////////////////////////
16    
17     BOOL CDefaultPlugin::LoadInitialize()
18     {
19     // ToDo:
20    
21     return doLoadInitialize(), TRUE;
22     }
23    
24     void CDefaultPlugin::ReceiveCallBack(const CByteArray &data)
25     {
26     CSingleLock sl(&m_NetLock, TRUE);
27    
28     // ToDo:
29     CalcReportList list;
30     CALCREPORT cr;
31     FTCALCDATA ftCalc;
32     CString cs, csText;
33     UINT nHdrSize = sizeof(FTCALCDATA) - sizeof(ColorList) - 4; // 32 byte(Including alignment)
34     UINT nWidth = m_CalcSize.nWidth;
35     int nSize = m_NodeInitList.GetSize();
36     int nIndex = -1;
37     int nYPoint;
38    
39     CopyMemory(&ftCalc, data.GetData(), nHdrSize);
40     ftCalc.list.SetSize(ftCalc.nSize);
41     CopyMemory(ftCalc.list.GetData(), data.GetData() + nHdrSize, ftCalc.nSize * sizeof(COLORREF));
42    
43     for (int i = 0; i < nSize; i++)
44     {
45     if ((m_NodeInitList[i].nIndex == ftCalc.nIndex) &&
46     (m_NodeInitList[i].wNodeID == ftCalc.wNodeID) &&
47     (m_NodeInitList[i].wSubID == ftCalc.wSubID))
48     {
49     nIndex = i;
50     break;
51     }
52     }
53    
54     if (nIndex != -1)
55     {
56     nYPoint = m_NodeInitList[nIndex].nYInit + ftCalc.nStepNo * m_NodeInitList[nIndex].nStep;
57    
58     for (int i = 0; i < m_NodeInitList[nIndex].nRange; i++)
59     {
60     API_SetXLine(nYPoint + i, nWidth, ftCalc.list.GetData() + i * nWidth);
61     }
62    
63     if (ftCalc.fEnd)
64     {
65     m_NodeInitList[nIndex].dbRuntime = ftCalc.dbRuntime;
66    
67     ++m_CalcCount.dwFinCount;
68    
69     if (m_CalcCount.dwAllCount == m_CalcCount.dwFinCount)
70     {
71     for (int i = 0; i < m_NodeInitList.GetSize(); i++)
72     {
73     ZeroMemory(&cr, sizeof(cr));
74     cr.dwAddress = m_NodeInitList[i].dwAddress;
75     cr.wNodeID = m_NodeInitList[i].wNodeID;
76     cr.wSubID = m_NodeInitList[i].wSubID;
77     cr.dbRuntime = m_NodeInitList[i].dbRuntime;
78     list.Add(cr);
79     }
80    
81     API_StopTimer();
82     API_StopPlugin(list);
83     }
84     }
85     }
86     }
87    
88     //////////////////////////////////////////////////////////////////////////
89    
90     BOOL CDefaultPlugin::MasterInitialize(const NodeDataList &list, BOOL fSystem)
91     {
92     MASTER_PLUGIN init;
93    
94     // ToDo:
95     init.bSystem = fSystem;
96     init.bFront = FALSE;
97     init.csWndName = _T("Mandelbrot");
98     init.list.Copy(list);
99    
100     return doMasterInitialize(init);
101     }
102    
103     BOOL CDefaultPlugin::MasterFinalize()
104     {
105     // ToDo:
106    
107     return doMasterFinalize(), TRUE;
108     }
109    
110     DWORD CDefaultPlugin::MasterTransaction(LPVOID lpParams)
111     {
112     // ToDo:
113     LPPLUGIN_PARAMS p = (LPPLUGIN_PARAMS)lpParams;
114     FLACTALE mb;
115     CString cs;
116     int nArgument;
117     UINT nWidth = m_CalcSize.nWidth;
118     UINT nHeight = m_CalcSize.nHeight;
119     UINT nRange = m_CalcSize.nRange;
120    
121     ByteArrayToString(p->arg, cs);
122    
123     try
124     {
125     nArgument = StrToInt(static_cast<LPCTSTR>(cs));
126     }
127     catch (CException* e)
128     {
129     nArgument = 4; // To default
130     e->Delete();
131     }
132    
133     // Parameters setting
134     switch (nArgument)
135     {
136     case 0:
137     mb.dbRealMin = -1.825;
138     mb.dbImgMin = -0.05;
139     mb.dbSide = 0.1;
140     mb.nCountMax = 1000;
141     break;
142    
143     case 1:
144     mb.dbRealMin = -0.7717;
145     mb.dbImgMin = 0.11653;
146     mb.dbSide = 0.00002;
147     mb.nCountMax = 1800;
148     break;
149    
150     case 2:
151     mb.dbRealMin = -0.712;
152     mb.dbImgMin = -0.274;
153     mb.dbSide = 0.0015;
154     mb.nCountMax = 500;
155     break;
156    
157     case 3:
158     mb.dbRealMin = -0.7465;
159     mb.dbImgMin = 0.1045;
160     mb.dbSide = 0.0015;
161     mb.nCountMax = 900;
162     break;
163    
164     case 4:
165     mb.dbRealMin = -1.2458;
166     mb.dbImgMin = -0.1894;
167     mb.dbSide = 0.023;
168     mb.nCountMax = 1000;
169     break;
170    
171     case 5:
172     mb.dbRealMin = -0.7525;
173     mb.dbImgMin = 0.1875;
174     mb.dbSide = 0.0415;
175     mb.nCountMax = 600;
176     break;
177    
178     case 6:
179     mb.dbRealMin = -0.7824;
180     mb.dbImgMin = 0.1267;
181     mb.dbSide = 0.0102;
182     mb.nCountMax = 500;
183     break;
184    
185     case 7:
186     mb.dbRealMin = -0.3824;
187     mb.dbImgMin = -1.2824;
188     mb.dbSide = 0.7824;
189     mb.nCountMax = 500;
190     break;
191    
192     default:
193     mb.dbRealMin = -2.0;
194     mb.dbImgMin = -1.25;
195     mb.dbSide = 2.5;
196     mb.nCountMax = 50;
197     break;
198     }
199    
200     mb.nWidth = nWidth;
201     mb.nHeigth = nHeight;
202    
203     if (p->fSystem)
204     {
205     // System mode
206     CByteArray data, tmp;
207     FLACTALEDATA ftInit;
208     NODEINIT ndInit;
209     int nStep, nIndex;
210     UINT nProcessors = 0;
211     UINT nSlaves = m_MasterPlugin.list.GetSize() - 1;
212    
213     for (UINT i = 0; i < nSlaves; i++)
214     {
215     nProcessors += m_MasterPlugin.list[i + 1].dwProcessors;
216     }
217    
218     m_NodeInitList.RemoveAll();
219     tmp.SetSize(sizeof(ftInit));
220     nIndex = 0;
221     nStep = nRange * nProcessors; // Calculation step
222    
223     m_CalcCount.dwAllCount = nProcessors;
224     m_CalcCount.dwFinCount = 0;
225    
226     for (UINT i = 0; i < nSlaves; i++)
227     {
228     ZeroMemory(&ndInit, sizeof(ndInit));
229     ZeroMemory(&ftInit, sizeof(ftInit));
230     ftInit.ft = mb;
231     ftInit.nSlaves = nSlaves;
232     ftInit.nProcessors = nProcessors;
233    
234     ndInit.nRange = nRange;
235     ndInit.nStep = nStep;
236     ndInit.wNodeID = m_MasterPlugin.list[i + 1].wNodeID;
237     ndInit.dwAddress = m_MasterPlugin.list[i + 1].dwAddress;
238     ndInit.fEnd = FALSE;
239    
240     // Per processors
241     for (UINT j = 0; j < m_MasterPlugin.list[i + 1].dwProcessors; j++)
242     {
243     ndInit.nIndex = nIndex;
244     ndInit.nYInit = nIndex * nRange;
245     ndInit.wSubID = static_cast<WORD>(j);
246     ftInit.nd = ndInit;
247     m_NodeInitList.Add(ndInit);
248     CopyMemory(tmp.GetData(), &ftInit, tmp.GetSize());
249     data.Append(tmp);
250     nIndex++;
251     }
252     }
253    
254     // Start
255     data.FreeExtra();
256     API_StartPlugin(m_PlgInfo.wPluginID, data);
257     }
258     else
259     {
260     // Single mode
261     CMandelbrot man;
262     CStopwatch sw;
263     ColorList color;
264     INT64 nDrawTime = 0;
265     double dbRuntime;
266     UINT nSpan = static_cast<int>(nHeight / p->dwThdCount);
267    
268     m_Stopwatch.Start();
269     man.Initialize(mb);
270     color.SetSize(m_CalcSize.nWidth);
271    
272     for (UINT i = nSpan * p->dwIndex; i < nSpan * (p->dwIndex + 1); i++)
273     {
274     man.Calculation(i, color.GetData());
275     sw.Start();
276    
277     if (!API_SetXLine(i, m_CalcSize.nWidth, color.GetData()))
278     {
279     break;
280     }
281    
282     nDrawTime += sw.NowByMicrosecond();
283     }
284    
285     dbRuntime = static_cast<double>(m_Stopwatch.NowByMicrosecond() - nDrawTime) / 1000000;
286     SetCalcReport(p->dwIndex, dbRuntime);
287     }
288    
289     return CPlugin::MasterTransaction();
290     }
291    
292     //////////////////////////////////////////////////////////////////////////
293    
294     BOOL CDefaultPlugin::SlaveInitialize(const SLAVE_PLUGIN &init)
295     {
296     // ToDo:
297    
298     return doSlaveInitialize(init);
299     }
300    
301     BOOL CDefaultPlugin::SlaveFinalize()
302     {
303     // ToDo:
304    
305     return doSlaveFinalize(), TRUE;
306     }
307    
308     DWORD CDefaultPlugin::SlaveTransaction(LPVOID lpParams)
309     {
310     // ToDo:
311     LPPLUGIN_PARAMS p = (LPPLUGIN_PARAMS)lpParams;
312     FLACTALEDATA ftInit;
313     FTCALCDATA ftCalc;
314     CMandelbrot man;
315     CByteArray data;
316     CStopwatch sw;
317     ColorList color;
318     CString cs;
319    
320     int nWidth, nHeight, nStep, nRange, nYInit;
321     int nPoint, nProgress, nMaxCount; // For progress
322     UINT nSlaves, nProcessors, nCpIndex;
323     UINT nHdrSize = sizeof(FTCALCDATA) - sizeof(ColorList) - 4; // 32 byte(Including alignment)
324     BOOL flag = FALSE;
325     DWORD dwIndex = p->dwIndex;
326     INT64 nSendTime = 0;
327    
328     CopyMemory(&nSlaves, p->arg.GetData(), sizeof(nSlaves));
329     CopyMemory(&nProcessors, p->arg.GetData() + sizeof(nSlaves), sizeof(nProcessors));
330    
331     for (UINT i = 0; i < nProcessors; i++)
332     {
333     nCpIndex = sizeof(ftInit) * i;
334     CopyMemory(&ftInit, (p->arg.GetData() + nCpIndex), sizeof(ftInit));
335    
336     if ((ftInit.nd.wNodeID == m_SlavePlugin.wNodeID) &&
337     (ftInit.nd.wSubID == static_cast<WORD>(dwIndex)))
338     {
339     ftCalc.nIndex = ftInit.nd.nIndex;
340     ftCalc.wNodeID = ftInit.nd.wNodeID;
341     ftCalc.wSubID = ftInit.nd.wSubID;
342     flag = TRUE;
343     break;
344     }
345     }
346    
347     if (flag)
348     {
349     m_Stopwatch.Start();
350     nWidth = ftInit.ft.nWidth;
351     nHeight = ftInit.ft.nHeigth;
352     nStep = ftInit.nd.nStep;
353     nRange = ftInit.nd.nRange;
354     nYInit = ftInit.nd.nYInit;
355    
356     man.Initialize(ftInit.ft);
357     color.SetSize(nWidth);
358     ftCalc.nStepNo = 0;
359     ftCalc.fEnd = FALSE;
360    
361     nProgress = 0;
362     nMaxCount = static_cast<int>(static_cast<double>(nHeight - nYInit) / nStep * nRange);
363    
364     ASSERT(nMaxCount != 0);
365    
366     for (int i = nYInit; i < nHeight; i += nStep)
367     {
368     ftCalc.list.RemoveAll();
369    
370     for (int j = 0; j < nRange; j++)
371     {
372     if (!m_fRunning)
373     {
374     goto END;
375     }
376    
377     man.Calculation(i + j, color.GetData());
378     ftCalc.list.Append(color);
379     nProgress++;
380     nPoint = static_cast<int>(nProgress * 100 / nMaxCount);
381     API_SetProgress(dwIndex, nPoint);
382     }
383    
384     sw.Start();
385     ftCalc.nSize = ftCalc.list.GetSize();
386     data.SetSize(nHdrSize + ftCalc.list.GetSize() * sizeof(COLORREF));
387    
388     if ((i + nStep) >= nHeight)
389     {
390     ftCalc.fEnd = TRUE;
391     ftCalc.dbRuntime = static_cast<double>(m_Stopwatch.NowByMicrosecond() - nSendTime) / 1000000;
392     m_SlavePlugin.dbRuntime = ftCalc.dbRuntime;
393     }
394    
395     CopyMemory(data.GetData(), &ftCalc, nHdrSize);
396     CopyMemory(data.GetData() + nHdrSize, ftCalc.list.GetData(), ftCalc.nSize * sizeof(COLORREF));
397     API_SendToMaster(data);
398     nSendTime += sw.NowByMicrosecond();
399    
400     ftCalc.nStepNo++;
401     }
402     }
403    
404     END:
405     return CPlugin::SlaveTransaction();
406     }
407    
408     //////////////////////////////////////////////////////////////////////////
409    

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26