Học tập‎ > ‎C++‎ > ‎

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\n”); 
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:

// process.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "windows.h" 
#include <stdio.h> 
#include "conio.h" 
/* Thanh Binh pro! hero_8490@yahoo.com */ 
#define NUM_OF_THREAD 2  // định nghĩa số thread để tạo 
char text***91;***93;="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\n%s\n\n",x); 
    
Sleep(1000); 
    } 
    return 
0


void main() 


         
Printf(“hero_8490@yahoo.com”); 
    
HANDLE thr***91;NUM_OF_THREAD***93;; //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***91;0***93;=CreateThread(NULL,0,task1,NULL,0,&thrid); 
       
printf("Well done for thread1, please wait for next thread!\n"); 
       
Sleep(500); 
                    
//tạo thread cho task2() 
                    //Truyền biến text vào và ép kiểu LPVOID ở tham số thứ 4 
             
thr***91;1***93;=CreateThread(NULL,0,task2, (LPVOID)text,0,&thrid); 
       
printf("Well done for thread 2, please wait for next thread!\n"); 
      
///Sleep(500); 
    //Lúc này 2 thread đang làm việc 
     
    
getch(); //Đợi ấn 1 phím bất kì 
    
CloseHandle(thr***91;0***93;); //đong thread 1 
    
CloseHandle(thr***91;1***93;); //đó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 test trên Windows XP chưa thử trên 7.

tks: anhcodon121 - http://www.ddth.com
Comments