Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Xử lý việc tăng Ram khi sử dụng MultiThread?

  1. #1
    Ngày gia nhập
    08 2009
    Bài viết
    51

    Wink Xử lý việc tăng Ram khi sử dụng MultiThread?

    Mình mới sử dụng Thread để làm một chương trình. Trong chương trinh mình sử dụng 2 Thread với vòng lặp While(true). Xong xuôi cả thì phát hiện Ram tăng liên tục khi thread chạy. Có thể hiểu đơn giản như chương trình sau:
    Mô tả ngắn gọn: Chương trình có 2 label (Để hiển thị DateTime.Now) và 4 nút (Để điều khiển 2 Thread):
    Visual C# Code:
    1.         private Thread thread1;
    2.         private Thread thread2;
    3.         private bool continue1;
    4.         private bool continue2;
    5.         public Form1()
    6.         {
    7.             InitializeComponent();
    8.         }
    9.  
    10.         private void button1_Click(object sender, EventArgs e)
    11.         {
    12.             //ThreadPool.QueueUserWorkItem(new WaitCallback(Thread1));
    13.             continue1 = true;
    14.  
    15.             thread1 = new Thread(new ThreadStart(Thread1));
    16.             thread1.Start();
    17.         }
    18.  
    19.         private void button2_Click(object sender, EventArgs e)
    20.         {
    21.             //ThreadPool.QueueUserWorkItem(new WaitCallback(Thread2));
    22.             continue2 = true;
    23.  
    24.             thread2 = new Thread(new ThreadStart(Thread2));
    25.             thread2.Start();
    26.         }
    27.  
    28.         private void button3_Click(object sender, EventArgs e)
    29.         {
    30.             continue1 = false;
    31.         }
    32.  
    33.         private void button4_Click(object sender, EventArgs e)
    34.         {
    35.             continue2 = false;
    36.         }
    37.  
    38.         private void Thread1()
    39.         {
    40.             while (true)
    41.             {
    42.                 if (continue1)
    43.                 {
    44.                     label1.Text = DateTime.Now.ToString();
    45.                 }
    46.                 Thread.Sleep(2000);
    47.             }
    48.         }
    49.  
    50.         private void Thread2()
    51.         {
    52.             while (true)
    53.             {
    54.                 if (continue2)
    55.                 {
    56.                     label2.Text = DateTime.Now.ToString();
    57.                 }
    58.                 Thread.Sleep(1000);
    59.             }
    60.         }

    Mình không hiểu lắm về cơ chế sử dụng RAM nên code không chuẩn.
    Cụ thể, với đoạn code trên, mình nhấn vào button1, RAM sẽ tăng thêm vài K sau mỗi 2s. Nhấn vào button2 thì RAM sẽ tăng thêm vài K sau mỗi 1s.
    Nếu chạy 2 thread cùng lúc thì lượng RAM tăng nhiều hơn khi chạy từng Thread một.

    Vấn đề ở đây là: Bình thường thì nó tăng rồi sau một thời gian hệ điều hành sẽ giải phóng nên lại giảm nhưng với đoạn Code này thì không thế (!?)

    Mình không hiểu, mong các bạn giúp đỡ mình. Cảm ơn các bạn!

  2. #2
    Ngày gia nhập
    01 2011
    Nơi ở
    /dev/null
    Bài viết
    6

    Nguyên nhân tăng RAM này là do sleep vs vòng loop của bạn. Theo nguyên tắc thì nên hạn chế sleep với vòg loop sử dụng cùng nhau. Nếu sử dụng sleep trong vòng loop thì nên sleep nhỏ thui còn sleep lớn nó sẽ bị một số hiêu ứng phụ như lag chương trình, tăng RAM,... Mình nghĩ có một ý tưởng này bạn thử coi sao. Tức là cứ cho nó lặp, thay vì dùng sleep thì để làm trễ nó thì mình sẽ làm cho nó chạy bình thường ko bị trễ, khi nào biến act kia cộng tới 1000 (thời gian để act cộng đến 1000 sẽ thay thời gian trễ khi bạn sử dụng sleep nên nếu nhanh hay chậm qá thì bạn có thể tăng giảm số 1000 này cho phù hợp, và biến act thay vì int bạn có thể sử dụng kiểu nào lớn hơn như longint gì đó) thì ta sẽ cho nó thực hiện công việc cần làm. Cụ thể ví dụ sau:

    PHP Code:
    int act 0// Biến global.

    void Thread()
    {
       while (
    true) {
          
    act++;
          if (
    act 1000) {
              
    label1.Text DateTime.Now.ToString();
              
    act 0;
          }
       }

    P.S: Mình code Delphi chứ C++ chẳg biết tí gì nên chỉ gọi là viết ý tưởng thui.
    Đã được chỉnh sửa lần cuối bởi vic4key : 07-04-2012 lúc 01:34 AM.
    NOTHING

  3. #3
    Ngày gia nhập
    08 2009
    Bài viết
    51

    Cảm ơn bạn đã trả lời

    Mình đã thử cách mà bạn nói nhưng có vẻ không ổn, không những Ram tăng mà lần này CPU cũng tăng luôn .
    Thực ra, ví dụ này chỉ thực hiện những công việc đơn giản ở trong mỗi thread. Thực tế thì trong mỗi thread mình làm khá nhiều việc và CPU sẽ tăng khá nhanh. Có thể mình sử dụng thread chưa đúng. Hoặc code không chuẩn gây dư thừa nhiều. Thực ra cũng không biết ko chuẩn chỗ nào

Các đề tài tương tự

  1. Bài tập C++ [Help] Xin định hướng làm bài tập về multithread HĐH
    Gửi bởi bladevn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 14-11-2011, 05:52 PM
  2. Vấn đề MultiThread và Socket, help me!
    Gửi bởi k_y_1989 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 05-06-2011, 06:17 PM
  3. Lập trình C++ Lập trình MultiThread với các số như thế nào?
    Gửi bởi anh_pc_14123 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 01-12-2010, 11:35 PM
  4. Hỏi về lập trình Multithread trong C
    Gửi bởi zangpt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 01-08-2008, 09:09 AM
  5. Xin tài liệu về lập trình Multithread trong C
    Gửi bởi zangpt trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 0
    Bài viết cuối: 13-05-2008, 10:37 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn