Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 3 123 CuốiCuối
Kết quả 1 đến 10 của 22
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Tạo Thread và đa xử lý trong 1 chương trình

    Tạo Thread và đa xử lý trong 1 chương trình

    Hôm nay mình chỉ cho các bạn về thread và cách tạo một ứng dụng nhỏ trong đó ứng dụng có nhiều thread con và mỗi thread làm một nhiệm vụ riêng độc lập và song song nhau. Lưu ý các bạn là ai biết rồi thì thôi ai chưa biết thì xem tham khảo mình không muốn viết xong mà bị mấy anh pro chê bai.

    Thì nếu bạn nào học chuyên về CNTT thì các bạn biết chủ đề này thuộc môn hệ điều hành. Trứơc khi viết code mình xin nói sơ là trong máy tính mỗi 1 chương trình đang chạy chúng ta gọi là tíên trình mội tiến trình có thể có 1 hay nhiều tiểu tiến trình thread. Các tiến trình hay tiểu tiến trình(TH) có thể hoạt động độc lập hay phụ thuộc nhau tuỳ theo nhu cầu của lập trình viên.
    Ví dụ sau đây mình có chương trình Visual C++ 6.0 console nhỏ (không ứng dụng thread)làm nhiệm vụ thứ nhất là nhấp nháy thanh taskbar và nhiệm vụ thứ 2 là in ra màn hình một dòng chữ .


    #include<stdio.h>
    #include<windows.h>
    Void an_taskbar();
    Void hien_taskbar();
    Void main()
    {
    While(1)
    {
    Printf(“hien ra mot dong chu
    ”);
    Sleep(1000);
    an_taskbar();
    Sleep(1000);
    hien_taskbar();
    }
    Return;
    }
    Void an_taskbar()
    {
    // các thủ tục để làm ẩn task bar;
    }
    Void hien_taskbar()
    {
    // các thủ tục để làm hiện task bar;
    }
    Như vậy chỉ với 1 process như trên thì việc muốn cùng lúc làm nhiều công việc rất thủ công và cực chưa kể đó chỉ là chương trình cỏn con còn những chương trình lớn thì sao?

    Bây giờ cũng chức năng đó nhưng ta tạo ra 2 cái threads, 1 cái làm nhiệm vụ in chữ còn 1 thread chuyên làm nhiệm vụ nhấp nháy task bar.

    Một số hàm về threads của windows:
    Tạo 1 thread từ không gian đc ảo của tiến trình hiện hành:
    HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    SIZE_T dwStackSize,
    LPTHREAD_START_ROUTINE lpStartAddress,
    LPVOID lpParameter,
    DWORD dwCreationFlags,
    LPDWORD lpThreadId
    );

    Trả về threaded:
    DWORD GetThreadId(
    HANDLE Thread
    );
    Trả về độ ưu tiên định thời:
    int GetThreadPriority(
    HANDLE hThread
    );

    Tạm ngưng thread:
    DWORD SuspendThread(
    HANDLE hThread
    );

    Phục hồi thread:
    DWORD ResumeThread(
    HANDLE hThread
    );

    Huỷ thread:
    BOOL TerminateThread(
    HANDLE hThread,
    DWORD dwExitCode
    );



    Đầu tiên bạn phải viết một hàm dạng WinAPI hàm này bạn có thể hiểu nôm na là bạn viết công việc vào đó bắt cái thread chuẩn bị tạo phải lo mà làm. Như vậy nếu bạn muốn tạo 100 cái thread làm 100 công việc # nhau thì cũng pải viết 100 hàm API khác nhau- Trên lý thuyết là như vậy;
    Cấu trúc hàm này như sau:
    DWORD WINAPI <tên hàm>(LPVOID tham_số)
    {
    // các xử lý;
    Return 0;
    }

    Sau đó khi tạo thread bạn truyền tên hàm này vào là ok;
    Sau đây là code chương trình có chú thích:


    Mã nguồn PHP:
    // process.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" #include <stdio.h> #include "conio.h" #define NUM_OF_THREAD 2 // định nghĩa số thread để tạo char text[]="anhcodon121"; DWORD WINAPI task1(LPVOID) //viết hàm API với các xử lý làm nhấp nháy //TASKBAR { HWND hWin; hWin = FindWindow("Shell_TrayWnd",NULL); EnableWindow(hWin,true); while(1) { ShowWindow(hWin,false); Sleep(1000); ShowWindow(hWin,true); Sleep(1000); } return 0; } //Viết hàm API làm nhịêm vụ in dòng chữ sau mỗi 1000mili secs; DWORD WINAPI task2(LPVOID x) { while(1) { printf("hero_8490@yahoo.com
    %s

    "
    ,x); Sleep(1000); } return 0; } void main() { Printf(“hero_8490@yahoo.com”); HANDLE thr[NUM_OF_THREAD]; //tạo mảng thr 2 ptử kiểu Handle; DWORD thrid; //tạo thread cho task1() //Vì lý do không truyền tham số đầu vào nên tham số thứ 4 là null thr[0]=CreateThread(NULL,0,task1,NULL,0,&thrid); printf("Well done for thread1, please wait for next thread!
    "
    ); Sleep(500); //tạo thread cho task2() //Truyền biến text vào và ép kiểu LPVOID ở tham số thứ 4 thr[1]=CreateThread(NULL,0,task2, (LPVOID)text,0,&thrid); printf("Well done for thread 2, please wait for next thread!
    "
    ); ///Sleep(500); //Lúc này 2 thread đang làm việc getch(); //Đợi ấn 1 phím bất kì CloseHandle(thr[0]); //đong thread 1 CloseHandle(thr[1]); //đóng thred 2 return; }  
    Sau bài này các bạn cũng cần update thêm các kiến thức về luồng, đồng bộ giữa các tiến trình, thread, các hàm về process, cấp phát không gian đ/c ảo…
    Code này mình mới text trên Windows XP chưa thử trên 7.
    Các bạn nếu mang bài này đi đâu nhớ ghi rõ là của mình trên trang ddth.com và congdongcviet.com nha!

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cậu làm multithread trên C/C++ mà vẫn dùng CreateThread là sai đấy, phải dùng beginthreadex.
    Em không phải pro vào chê bai, nhưng thấy sai là phải nói thôi, sorry nhé. Em chỉ là newbie thôi.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi TQN
    Cậu làm multithread trên C/C++ mà vẫn dùng CreateThread là sai đấy, phải dùng beginthreadex.
    Em không phải pro vào chê bai, nhưng thấy sai là phải nói thôi, sorry nhé. Em chỉ là newbie thôi.
    Anh TQN mà là gà thì tụi em là cát bụi rùi

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    createthread mới là hàm chuẩn cậu ạ

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi anhcodon121
    createthread mới là hàm chuẩn cậu ạ
    Lời của TQN là hoàn toàn đúng đấy anhcodon121 à; cậu có quan điểm thế nào khi đọc được cái này:

    CreateThread() is a raw Win32 API call for creating another thread of control at the kernel level.
    _beginthread() & _beginthreadex() are C runtime library calls that call CreateThread() behind the scenes. Once CreateThread() has returned, _beginthread/ex() takes care of additional bookkeeping to make the C runtime library usable & consistent in the new thread.

    In C++ you should almost certainly use _beginthreadex() unless you won't be linking to the C runtime library at all (aka MSVCRT*.dll/.lib).
    ???????????????

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    chủ thớt chủ giao chủ kéo ko quay lại thì có tớ đọc mà
    cám ơn cậu, giờ thì tớ đã hiểu ý của anh TQN

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi TQN
    Cậu làm multithread trên C/C++ mà vẫn dùng CreateThread là sai đấy, phải dùng beginthreadex.
    Em không phải pro vào chê bai, nhưng thấy sai là phải nói thôi, sorry nhé. Em chỉ là newbie thôi.
    cám ơn anh TQN đã chỉ

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Vớ vỉn CreateThread là API của Windows chớ. Chuẩn cái gì mà chuẩn. Cậu vác sang Linux (cấm dùng Wine) xem nó có biên dịch chuẩn và chạy chuẩn nổi không?

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Dân học lập trình thường là từ người biết sử dụng Windows trước, vì Windows quá phổ biến nên khi học lập trình các bạn cũng dùng các công cụ lập trình trên Windows. Mà anh chàng M$ thì có sẵn VC++ , thì ta lại xài hàng của M$ tiếp. Nhưng có biết đâu rằng thằng cha VC++ là của thằng MS làm ra hỗ trợ mỗi cái chuẩn chung C++ còn đâu lập trình GUI hay gì đó toàn là thư viện, API chỉ dành cho Windows mà thôi. Vì thế mà lập trình viên làm toàn trên Windows và VC++ sẽ không rõ trời biển bao la ngoài kia của thế giới C++.

    Cứ cho rằng các hàm làm việc trên Windows là chuẩn của C++. Cái này lỗn lận [IMG]images/smilies/1.gif[/IMG] à quên lẫn lộn à nghen.

    Bao giờ bạn làm 1 chương trình code bằng C++ chuẩn mà compile chạy trên cả Windows và Linux (chưa nói một số nền tảng hệ điều hành khác) bạn sẽ thấy được trời biển bao la đó.

  10. #10
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0
    Ngại quá [IMG]images/smilies/1.gif[/IMG] mình ngứa miệng chủ thớt post xong bài chạy mất tăm không thấy quay lại nữa nhỉ, vẫn là new member mà chưa có star nào [IMG]images/smilies/21.gif[/IMG].
    Mong một ngày chủ thớt sẽ trở lại [IMG]images/smilies/Cry.gif[/IMG]

 

 
Trang 1 của 3 123 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •