Develop and Download Open Source Software

Browse Subversion Repository

Contents of /Plugin/DefaultPlugin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (show 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 #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