16-12-2007, 18:43
|
|
|
חבר מתאריך: 23.11.07
הודעות: 187
|
|
אפשר לפתור את זה בכמה דרכים. הדרך הקלה היא להכניס בדיקה בכל סיבוב של הלולאה שלך כדי לראות אם מישהו לחץ על כפתור העצירה. בזמן שהלולאה רצה זה לא מכביד על המחשב יותר מדי, כי ממילא הוא עושה עבודה. אבל מה קורה בזמן שהלולאה לא מבצעת את הפעולה? המחשב ממשיך לרוץ רק כדי לבדוק אם מישהו הפעיל אותה מחדש. מאוד לא יעיל ובזבזני.
הדרך הפחות קלה היא לעשות שני דברים בו-זמנית: גם להריץ את הלולאה וגם לחכות שמישהו ילחץ על הכפתור (ולא להמשיך כל עוד אין לחיצה על הכפתור). בשביל זה צריך להשתמש בנושא די כבד שנקרא THREADS שמאפשרים הרצת כמה משימות באותה תוכנית. לא נכנס לעוד פרטים כאן, אבל בגדול זה אמור לעשות את העבודה (בהנחה שאתה על WINDOWS ובלי בדיקת שגיאות):
קוד:
#include <stdio.h>
#include <windows.h>
#define STOP_KEY 's' // USED TO STOP THE LOOP
#define QUIT_KEY 'q' // USED TO QUIT THE PROGRAM ALTOGETHER
DWORD WINAPI ThreadProc(LPVOID pParam)
{
// DO YOUR LOOP WORK HERE, FOR EXAMPLE:
int number = 0;
while(true)
{
printf("%d\n", number++);
Sleep(1000);
}
}
void main(int argc, char** argv)
{
BOOL isThreadRunning = TRUE;
// Create the worker thread
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL,
0, NULL);
// TODO: Check successfull thread creation here
while(true)
{
int pressedKey = _getch(); // Block waiting for keypress
if(pressedKey == STOP_KEY)
{
isThreadRunning ?
SuspendThread(hThread) : // Suspend the worker thread
ResumeThread(hThread); // Resume the worker Thread
isThreadRunning = !isThreadRunning; // Negate worker thread status flag
}
else if (pressedKey == QUIT_KEY)
break;
}
CloseHandle(hThread); // Destroy worker thread
}
|