[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
|
0 |
|
|
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
|
|
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é! |
|
|
|
|
[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
|
0 |
|
|
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
|
|
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:
|
|
|
|
|
[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
|
0 |
|
|
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
|
|
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 ạ. |
|
|
|
|
[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
|
0 |
|
|
Joined: 04/09/2008 13:08:09
Messages: 10
Offline
|
|
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:
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.
|
|
|
|
|
[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
|
0 |
|
|
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
|
|
Cám ơn anh, em làm được rồi! |
|
|
|
|
[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
|
0 |
|
|
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
|
|
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 ý ạ? |
|
|
|
|
[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
|
0 |
|
|
Joined: 04/09/2008 13:08:09
Messages: 10
Offline
|
|
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 .
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. |
|
|
|
|
[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
|
0 |
|
|
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
|
|
ủ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ả |
|
|
[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
|
0 |
|
|
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
|
|
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|
|
|