- Timestamp:
- 1/12/2010 8:05:29 AM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eraser6/SpeedMeter/Eraser.Manager/ProgressManager.cs
r1506 r1510 262 262 { 263 263 List = new List<Step>(); 264 ListLock = manager.ListLock; 264 265 Manager = manager; 265 266 } … … 269 270 public int IndexOf(Step item) 270 271 { 271 return List.IndexOf(item); 272 lock (ListLock) 273 return List.IndexOf(item); 272 274 } 273 275 274 276 public void Insert(int index, Step item) 275 277 { 276 List.Insert(index, item); 277 TotalWeights += item.Weight; 278 lock (ListLock) 279 { 280 List.Insert(index, item); 281 TotalWeights += item.Weight; 282 } 278 283 } 279 284 280 285 public void RemoveAt(int index) 281 286 { 282 TotalWeights -= List[index].Weight; 283 List.RemoveAt(index); 287 lock (ListLock) 288 { 289 TotalWeights -= List[index].Weight; 290 List.RemoveAt(index); 291 } 284 292 } 285 293 … … 288 296 get 289 297 { 290 return List[index]; 298 lock (ListLock) 299 return List[index]; 291 300 } 292 301 set 293 302 { 294 TotalWeights -= List[index].Weight; 295 List[index] = value; 296 TotalWeights += value.Weight; 303 lock (ListLock) 304 { 305 TotalWeights -= List[index].Weight; 306 List[index] = value; 307 TotalWeights += value.Weight; 308 } 297 309 } 298 310 } … … 304 316 public void Add(Step item) 305 317 { 306 List.Add(item); 307 TotalWeights += item.Weight; 318 lock (ListLock) 319 { 320 List.Add(item); 321 TotalWeights += item.Weight; 322 } 308 323 } 309 324 310 325 public void Clear() 311 326 { 312 List.Clear(); 313 TotalWeights = 0; 327 lock (ListLock) 328 { 329 List.Clear(); 330 TotalWeights = 0; 331 } 314 332 } 315 333 316 334 public bool Contains(Step item) 317 335 { 318 return List.Contains(item); 336 lock (ListLock) 337 return List.Contains(item); 319 338 } 320 339 321 340 public void CopyTo(Step[] array, int arrayIndex) 322 341 { 323 List.CopyTo(array, arrayIndex); 342 lock (ListLock) 343 List.CopyTo(array, arrayIndex); 324 344 } 325 345 326 346 public int Count 327 347 { 328 get { return List.Count; } 348 get 349 { 350 lock (ListLock) 351 return List.Count; 352 } 329 353 } 330 354 … … 366 390 /// The total weights of all the steps. 367 391 /// </summary> 368 p ublicfloat TotalWeights392 private float TotalWeights 369 393 { 370 394 get … … 372 396 return totalWeights; 373 397 } 374 privateset398 set 375 399 { 376 400 if (value >= 1.1f || value < 0.0f) … … 388 412 389 413 /// <summary> 414 /// The lock object guarding the list against parallel writes. 415 /// </summary> 416 private object ListLock; 417 418 /// <summary> 390 419 /// The <see cref="SteppedProgressManager"/> instance which owns this list. 391 420 /// </summary> … … 404 433 { 405 434 Steps = new StepsList(this); 435 ListLock = new object(); 406 436 } 407 437 … … 411 441 { 412 442 float result = 0.0f; 413 foreach (Step step in Steps) 414 result += step.Progress.Progress * step.Weight; 443 lock (ListLock) 444 foreach (Step step in Steps) 445 result += step.Progress.Progress * step.Weight; 415 446 416 447 return result; … … 457 488 get 458 489 { 459 if (Steps.Count == 0) 460 return null; 461 462 foreach (Step step in Steps) 463 if (step.Progress.Progress < 1.0f) 464 return step; 465 466 //Return the last step since we don't have any 467 return Steps[Steps.Count - 1]; 468 } 469 } 490 lock (ListLock) 491 { 492 if (Steps.Count == 0) 493 return null; 494 495 foreach (Step step in Steps) 496 if (step.Progress.Progress < 1.0f) 497 return step; 498 499 //Return the last step since we don't have any 500 return Steps[Steps.Count - 1]; 501 } 502 } 503 } 504 505 /// <summary> 506 /// The lock object guarding the list of steps against concurrent read and write. 507 /// </summary> 508 private object ListLock; 470 509 } 471 510 … … 481 520 public class SubTasksList : IList<ProgressManagerBase> 482 521 { 483 public SubTasksList( )522 public SubTasksList(ParallelProgressManager manager) 484 523 { 485 524 List = new List<ProgressManagerBase>(); 525 ListLock = manager.TaskLock; 486 526 } 487 527 … … 490 530 public int IndexOf(ProgressManagerBase item) 491 531 { 492 return List.IndexOf(item); 532 lock (ListLock) 533 return List.IndexOf(item); 493 534 } 494 535 495 536 public void Insert(int index, ProgressManagerBase item) 496 537 { 497 List.Insert(index, item); 538 lock (ListLock) 539 List.Insert(index, item); 498 540 } 499 541 500 542 public void RemoveAt(int index) 501 543 { 502 List.RemoveAt(index); 544 lock (ListLock) 545 List.RemoveAt(index); 503 546 } 504 547 … … 507 550 get 508 551 { 509 return List[index]; 552 lock (ListLock) 553 return List[index]; 510 554 } 511 555 set 512 556 { 513 List[index] = value; 557 lock (ListLock) 558 List[index] = value; 514 559 } 515 560 } … … 521 566 public void Add(ProgressManagerBase item) 522 567 { 523 List.Add(item); 568 lock (ListLock) 569 List.Add(item); 524 570 } 525 571 526 572 public void Clear() 527 573 { 528 List.Clear(); 574 lock (ListLock) 575 List.Clear(); 529 576 } 530 577 … … 536 583 public void CopyTo(ProgressManagerBase[] array, int arrayIndex) 537 584 { 538 List.CopyTo(array, arrayIndex); 585 lock (ListLock) 586 List.CopyTo(array, arrayIndex); 539 587 } 540 588 541 589 public int Count 542 590 { 543 get { return List.Count; } 591 get 592 { 593 lock (ListLock) 594 return List.Count; 595 } 544 596 } 545 597 … … 551 603 public bool Remove(ProgressManagerBase item) 552 604 { 553 return List.Remove(item); 605 lock (ListLock) 606 return List.Remove(item); 554 607 } 555 608 … … 580 633 581 634 /// <summary> 582 /// The total weights of all the steps. 583 /// </summary> 584 public int TotalWeights 585 { 586 get; 587 private set; 588 } 635 /// The lock object guarding the list from concurrent read/writes. 636 /// </summary> 637 private object ListLock; 589 638 } 590 639 … … 594 643 public ParallelProgressManager() 595 644 { 596 Tasks = new SubTasksList(); 645 Tasks = new SubTasksList(this); 646 TaskLock = new object(); 597 647 } 598 648 … … 602 652 { 603 653 float result = 0.0f; 604 foreach (ProgressManagerBase subTask in Tasks) 605 result += subTask.Progress * (1.0f / Tasks.Count); 654 lock (TaskLock) 655 foreach (ProgressManagerBase subTask in Tasks) 656 result += subTask.Progress * (1.0f / Tasks.Count); 606 657 607 658 return result; … … 614 665 { 615 666 int maxSpeed = 0; 616 foreach (ProgressManagerBase subTask in Tasks) 617 maxSpeed = Math.Max(subTask.Speed, maxSpeed); 667 lock (TaskLock) 668 foreach (ProgressManagerBase subTask in Tasks) 669 maxSpeed = Math.Max(subTask.Speed, maxSpeed); 618 670 619 671 return maxSpeed; … … 626 678 { 627 679 TimeSpan maxTime = TimeSpan.MinValue; 628 foreach (ProgressManagerBase subTask in Tasks) 629 if (maxTime < subTask.TimeLeft) 630 maxTime = subTask.TimeLeft; 680 lock (TaskLock) 681 foreach (ProgressManagerBase subTask in Tasks) 682 if (maxTime < subTask.TimeLeft) 683 maxTime = subTask.TimeLeft; 631 684 632 685 return maxTime; … … 643 696 private set; 644 697 } 698 699 /// <summary> 700 /// The lock object guarding the list of tasks against concurrent read and write. 701 /// </summary> 702 private object TaskLock; 645 703 } 646 704 }
Note: See TracChangeset
for help on using the changeset viewer.
