banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++?  XML
  [Programming]   Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 17/10/2008 11:28:20 (+0700) | #1 | 155549
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Em có hàm sau:
Code:
Recursivite::Try(int j)
{
	for(int i=0;i<8;i++)
		if(a[i]&&b[i+j]&&c[i-j+7])
		{
			x[j]=i;
			a[i]=false; b[i+j]=false; c[i-j+7]=false;
			if(j<7) Try(j+1);
			else [color=red]store()[/color];
			a[i]=true; b[i+j]=true; c[i-j+7]=true;
		}

	return 0;
}

Em muốn hỏi các anh là có cách nào để thay cái hàm store() kia bằng 1 lệnh dừng chương trình, nhảy tới hàm chờ nhận thông điệp từ 1 button, khi ấn button đó thì hàm Try(j) kia sẽ được tiếp tục ko ạ?
Cám ơn các anh trước nhé!
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 17/10/2008 11:35:43 (+0700) | #2 | 155551
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
VC++ thì mình cũng ko biết rõ lắm
Mình nghĩ là tới cái hàm store thì bạn thử thêm đoạn tượng tự đoạn này xem:

Code:
repeat
until a=true;
a = false;


button thì tạo cho nó 1 event click:

Code:
a=true;
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 18/10/2008 06:49:31 (+0700) | #3 | 155642
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Làm thế thì chương trình sẽ bị rơi vào vòng lặp vô hạn và bị treo anh ạ.
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 03/11/2008 12:37:48 (+0700) | #4 | 157435
compiz_tux
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 13:08:09
Messages: 10
Offline
[Profile] [PM]

bboy0303 wrote:

Em muốn hỏi các anh là có cách nào để thay cái hàm store() kia bằng 1 lệnh dừng chương trình, nhảy tới hàm chờ nhận thông điệp từ 1 button, khi ấn button đó thì hàm Try(j) kia sẽ được tiếp tục ko ạ?
 


Giả sử bạn viết ứng dụng trên Windows (Win32/MFC đều được).
- Định nghĩa riêng 1 message, gọi là WM_STORE (có thể đặt WM_STORE là WM_USER + 1)
- Tạo 1 cửa sổ (HWND với Win32 hoặc CWnd với MFC), tạm gọi là pHiddenWnd. Ngay sau khi tạo ra, bạn hide nó đi (gọi ShowWindow với SW_HIDE).
- Thay thế hàmstore() bằng cách gởi message WM_STORE đến pHiddenWnd. Lưu ý, không được dùng PostMessage() mà phải dùng SendMessage() (trong MFC thì gọi ::SendMessage()). Ngay lúc này, Recursivite::Try() sẽ bị block lại cho đến khi pHiddenWnd xử lý xong WM_STORE. Lý do: "The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message" - theo MSDN.
- Cửa sổ pHiddenWnd xử lý WM_STORE như sau:
Code:
while (bLock) // bLock là 1 biến toàn cục dạng static boolean, có giá trị khởi tạo là TRUE
         {
             Sleep vài trăm mili giây; //nằm chờ ở đây cho đến khi bLock được gán bằng FALSE
         }
         store();
         bLock = TRUE; //gán lại bằng TRUE để lần sau vào thì nằm chờ trong while
         break khỏi hàm xử lý WM_STORE hoặc return;

- Khi 1 button nào đó của bạn được nhấn (WM_KEYUP đối với Win32 hoặc OnKeyUp đối với MFC) thì gán:
Code:
bLock = FALSE;

Lúc này, khi bLock là FALSE, hàm xử lý WM_STORE sẽ thoát khỏi vòng lặp while, thực hiện hàm store() rồi kết thúc việc xử lý thông điệp WM_STORE. Khi pHiddenWnd xử lý xong WM_STORE thì SendMessage trong Recursivite::Try() sẽ trả về và Recursivite::Try() tiếp tục được thực hiện.
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 04/11/2008 06:31:36 (+0700) | #5 | 157533
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Cám ơn anh, em làm được rồi!
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 04/11/2008 11:20:28 (+0700) | #6 | 157563
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Anh ơi, thế có cách nào kết thúc luôn cái hàm Try() đó ko ạ, tức là giả sử đang chạy, hiện ra 1 cái dialog, trên dialog có 1 nút, khi click vào thì dừng lại ko chạy nữa ý ạ?
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 04/11/2008 12:54:59 (+0700) | #7 | 157572
compiz_tux
Member

[Minus]    0    [Plus]
Joined: 04/09/2008 13:08:09
Messages: 10
Offline
[Profile] [PM]
Bạn sửa lại Try() như thế này:
Code:
int Recursivite::Try(int j)
{
    //add begin
    if (bExit) //bExit là biến toàn cục static boolean, khởi tạo có giá trị FALSE
        return 1;
    //add end
    
    for(int i=0;i<8;i++)
        if(a[i]&&b[i+j]&&c[i-j+7])
       {
            x[j]=i;
            a[i]=false; b[i+j]=false; c[i-j+7]=false;
            
            //modify begin
            if(j<7) 
                if (Try(j+1) == 1)
                    return 1;
            //modify end
            
            else store();

            a[i]=true; b[i+j]=true; c[i-j+7]=true;
        }
        
        return 0;
}


Khi button được nhấn, bạn gán bExit bằng TRUE.

Thật ra cách làm ở trên chỉ giải quyết tình thế, và là 1 giải pháp không tốt smilie.
Bạn có thể xem lại thiết kế ban đầu của Try(), không nên tách rời Try() như 1 phương thức độc lập mà phải gán nó vào ngữ cảnh chung của quá trình xử lý thông điệp. Như vậy mình có thể hạn chế được việc lạm dụng biến toàn cục, cũng như để bản thân Try() không trở nên ngày càng phức tạp.
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 04/11/2008 13:10:00 (+0700) | #8 | 157573
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
ủa thế thì cách trên khác cách của mình chỗ nào nhỉ.
Thay repeat until bằng while là chạy đc hả smilie
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi cách dừng và tiếp tục 1 chu trình trong VC++? 08/11/2008 13:21:20 (+0700) | #9 | 158113
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Cám ơn các anh đã góp ý!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|