שאלה בתכנות threads ב-Visual

  • פותח הנושא rodsh
  • פורסם בתאריך

rodsh

New member
שאלה בתכנות threads ב-Visual

שלום לכם, איך הורג יש thread מתוך thread אחר?
 

odstudio

New member
לא להרוג!

מומלץ שלא להרוג thread מסויים ע"י thread אחר בעזרת פונקציות ה- API. עדיף פשוט להשתמש ב- flag שכל עוד הוא בעל ערך true ה thread פועל, כך שכאשר thread אחר ישנה את ערך ה flag ל- false ה- thread יסתיים בצורה יפה. כמובן שה- flag צריך להיות משתנה ששני ה -threads יכירו, למשל משתנה גלובלי. המלצה: כאשר ה- thread ההורג משנה את ערך ה- flag ל- false, כדאי לקרוא לאחר מכן לפונקציית WaitForSingleObject עם handle של ה- thread המסתיים על מנת להבטיח יציאה מסודרת שלו.
 

rodsh

New member
אבל....

תחשוב על סיטואציה כזאת: נאמר שיש לך תוכנית FTP להורדת קבצים. והצחלת להוריד קובץ גדול. אתה שם לב לב שההורדה תקועה ולכן רוצה לבטל ולהתחיל הורדה של קובץ אחר. אם תהליך הורדה מורכב מסידרת פקודות ארוכה למדי, הרי שבין כל שלב ושלב יש לבדוק האם הדגל מאפשר עבודה, כלומר לא מובטח שהעצירה תהיה מיידית. האם לא עדיף לבנות מבנה הכולל את כל ההקצאות זיכרון שלהם הthread נזקק לעבודתו, ואז הריגתו ע"י Terminate תהיה תקינה אם ה-thread ההורג ידאג לשחרר את כל המשאבים שה-thread ההורג תפס? לגבי terminate כתוב ב-help שהמחסנית שלו מפונית, אם כן למה עוד יש לחשוש בסיום כזה של thread? האם לא רק מהקצאות נוספות על ה-heap? מה דעתך?
 

odstudio

New member
צודק אבל...

אל תשכח שאתה משתמש בפונקציות API למשל שלא אתה כתבת. מה עם זכרון שהן מקצות בזמן קריאה להן למשל? מי ישחרר את הזיכרון הזה? ולא רק בעניין זיכרון מדובר. נניח שקריאה לפונקציה שלך מאתחלת דרייבר מסויים (למשל מודם או כרטיס קול). עכשיו כשהוא נמצא במצב מסויים, אתה הורג את ה- thread ואז אין לך כל דרך לשחרר את הדרייבר והתוצאות במקרה זה יכולות להיות קריטיות יותר אפילו מזכרון לא משוחרר. בכל אופן מה שאני רוצה להגיד, שעליך להתחשב בגורמים כאלה ואחרים, ולא לבנות על זה שאתה פשוט יכול להרוג thread ע"י קריאה לפונקציה. לכן צריך לתכנן ולבנות את התכנית כך שלא יווצר מצב שבו אתה מוכרח לקרוא לפונקצית הריגת thread.
 
למעלה